Skip to content

JDBC中的事务

JDBC中的默认事务是自动提交

将JDBC中的事务设置为手动提交

然后进行数据库的修改,如果没有出现异常并且数据正常,进行提交

如果出现异常,直接回滚数据

java
Connection conn = null;
PreparedStatement pr = null;
try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc_test", "root", "123456");
    // 将自动提交禁用
    conn.setAutoCommit(false);
    String sql = "update t_user set realName = ? where id = ? ";
    pr = conn.prepareStatement(sql);
    pr.setString(1,"123");
    pr.setInt(2,15);
    int count = pr.executeUpdate();

    pr.setString(1,"123");
    pr.setInt(2,16);
    count += pr.executeUpdate();

    // 如果能到这里一定没有问题,将数据进行提交
    conn.commit();
    System.out.println(count);
} catch (ClassNotFoundException | SQLException e) {
    // 如果出现异常,直接将数据库进行回滚
    if (conn != null) {
        try {
            conn.rollback();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    e.printStackTrace();
} finally {
    if (pr != null) {
    }
    if (conn != null) {
    }
}

乐观锁和悲观锁

乐观锁:支持并发,事务不需要排队,之不要需要一个版本号

多线程之间同时进行数据的修改:

第一个线程先修改数据,并将版本号从1.0更新到1.1

第二个线程更新完数据后,发现版本号是1.1和最初的版本号不同,会自动回滚

如果多个线程更新数据,更新前版本号和更新后的版本号一致,那么数据安全,会提交

悲观锁(行级锁):事务必须排队,数据被锁住了,不允许并发

在查询语句后加上 for updata 就是行级锁

sql
select username
from t_user
where username like '%a_' for update

本站除转载文章或特殊说明外,均遵循 CC BY-SA 4.0 协议发布。