侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 93 篇文章
  • 累计创建 110 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

JDBC事务管理方式

Epoch
2021-02-04 / 0 评论 / 0 点赞 / 294 阅读 / 733 字 / 正在检测是否收录...

JDBC事务管理方式

介绍什么是事务

事务是一种可靠的、一致的,访问和操作数据库的程序单元
说人话:要么把事情做完,要么什么都不做,不要做一半
事务依赖于数据库实现,MySQL通过事务区作为数据缓冲地带

事务的提交

image-20210204211122309.png

事务进行写操作是对事务区进行写操作,只有程序进行commit提交之后才会进行写入操作

事务的回滚

image-20210204211254393.png

如果写入数据发生某种异常,我们应用程序提交rollback回滚,我们会清空事务区,数据库表中不会进行任何写入操作

JDBC两种事务模式

JDBC允许两种事务模式
自动提交事务模式
手动提交事务模式

自动提交事务模式

自动提交事务模式是指没执行一次写操作SQL,自动提交事务
自动提交开启方法:conn.setAutoCommit(true);
JDBC默认就是开启自动提交
自动事务是JDBC默认行文,此模式无法保证多数据的一致性

手动提交事务模式

手动提交事务模式是指显示调用commit()与rollback()方法管理事务
手动提交开启方法:conn.setAutoCommit(false);
手动提交事务可保证多数据的一致性,但必须手动调用提交/回滚方法

JDBC手动事务开发技巧

自动提交事务demo
package com.xmaven;

import com.xmaven.utils.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * @ClassName TranslationSample
 * @Description TODO JDBC中的事务控制 自动提交事务
 * @Author Ambition
 * @Date 2021/2/4 21:22
 * @Version 1.0.0
 **/
public class TranslationSample {

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = DbUtils.getConnection();
            // JDBC默认使用自动提交模式
            String sql = "insert into user(id,username,password,salary,dname) values(?,?,?,?,?)";
            for (int i = 20; i < 2000; i++) {
                if (i == 25) {
                    throw new RuntimeException("插入失败");
                }
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, i);
                pstmt.setString(2, "员工" + i);
                pstmt.setString(3, "a123456");
                pstmt.setFloat(4, 4000f);
                pstmt.setString(5, "市场部");
                pstmt.executeUpdate();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeConnection(null, pstmt, conn);
        }
    }

}


手动提交事务demo
package com.xmaven;

import com.xmaven.utils.DbUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @ClassName TranslationSample2
 * @Description TODO JDBC中的事务控制 手动提交事务
 * @Author Ambition
 * @Date 2021/2/4 21:22
 * @Version 1.0.0
 **/
public class TranslationSample2 {

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;

        try {
            conn = DbUtils.getConnection();
            // JDBC默认使用自动提交模式
            conn.setAutoCommit(false);
            String sql = "insert into user(id,username,password,salary,dname) values(?,?,?,?,?)";
            for (int i = 20; i < 2000; i++) {
                if (i == 25) {
                    //throw new RuntimeException("插入失败");
                }
                pstmt = conn.prepareStatement(sql);
                pstmt.setInt(1, i);
                pstmt.setString(2, "员工" + i);
                pstmt.setString(3, "a123456");
                pstmt.setFloat(4, 4000f);
                pstmt.setString(5, "市场部");
                pstmt.executeUpdate();
            }
            conn.commit(); // 提交数据
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (conn != null || !conn.isClosed()) {
                    conn.rollback(); //回滚数据
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } finally {
            DbUtils.closeConnection(null, pstmt, conn);
        }
    }

}

0

评论区