JDBC管理事务

JDBC控制事务

  • 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失效

  • 使用Connection对象来管理事务:

    开启事务:setAutoCommit(boolean autoCommit):调用该方法设置参数为false,即开启事务

    提交事务:commit()

    回滚事务:roolback()

  • setAutoCommit(boolean autoCommit):true:开启自动提交;false关闭自动提交

    ​ 将此连接的自动提交模式设置为给定状态。如果连接处于自动提交模式下,则它的所有SQL语句将被执行并作为单个事务提交。否则直到调用commit方法或rollback方法为止。

    提交发生在语句完成时,完成时间取决于SQL语句的类型:

    • 对于DML语句(比如insert、update、delete)和DDL语句,语句在执行完毕时完成
    • 对于select语句,语句在关联结果集关闭时完成
    • 对于CallableStatement对象或者返回多个结果的语句,语句在所有关联结果集关闭并且已经获得所有更新计数和输出参数时完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try {
conn = JDBCutils.getConnection();
//开启事务,在执行sql前开启
conn.setAutoCommit(false);
String sql1 = "update stu set account = account - 500 where id = 2";
stmt1 = conn.prepareStatement(sql1);
stmt1.executeUpdate();
String sql2 = "update stu set account = account + 500 where id = 1";
stmt2 = conn.prepareStatement(sql2);
stmt2.executeUpdate();
//手动添加一个异常
int a = 1 / 0;
//所有sql都执行完提交事务
conn.commit();
} catch (Exception e) {
//不管出现什么异常在catch中都需要回滚
try {
if(conn!=null)
conn.rollback();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
e.printStackTrace();
}