JAVA jdbc事务案例 作者:马育民 • 2020-01-29 22:15 • 阅读:10058 需要掌握:[数据库事务的4个特性(ACID)](https://www.malaoshi.top/show_1EF3uCskLf9s.html "数据库事务的4个特性(ACID)") # 应用场景 - 在一个操作中,执行多次 **增、删、改** 时,需要使用事务 - 在某些企业,只要执行 **增、删、改** 操作,就需要使用事务 - 使用某些框架时,只要执行 **增、删、改** 操作,就需要使用事务,如:hibernate # 步骤 ### 第一步:设置 非自动提交 数据库连接 默认是 **自动提交** 的,意思是:只要执行 **增、删、改** 操作,就 **立即 自动 保存** 到数据库中 而我们的想法是:**需要提交时,才会提交**,所以需要设置数据库连接为 **非自动提交**,如下: ``` conn.setAutoCommit(false); ``` ### 第二步:提交事务、回滚事务 编写 `try...catch...` 代码块,在 `try` 代码块内,编写 **增、删、改 数据库操作**,如下: ``` try{ //增删改数据库操作 ..... ..... //当上面操作没有报错时,提交事务,此时才会保存到数据库 //执行conn.setAutoCommit(false)后,连接为非自动提交,那么不执行commit(),增删改操作不会保存到数据库中 conn.commit(); }catch(Exception e){ //如果报错,就回滚,数据恢复到初始值 conn.rollback(); } ``` ### 注意 - 数据库连接为 **非自动提交** 时,才能执行 **提交事务**、**回滚事务**。 - 如果是 **自动提交**,执行 `commit()`、`rollback()` **会报错** # 完善银行转账 原银行转换见 [数据库事务-银行转账问题](https://www.malaoshi.top/show_1IX2idpROSDP.html "数据库事务-银行转账问题") 导包: ``` import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; ``` java代码: ``` Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://127.0.0.1:3308/scott?useSSL=false&useUnicode=true&characterEncoding=utf-8"; Connection conn = DriverManager.getConnection(url, "root",//用户名 "");//密码 //===关键,设置不自动提交============== conn.setAutoCommit(false); try{ //从马云账户减掉100 String sql="update account set money=money-? where aid=?"; PreparedStatement pstm=conn.prepareStatement(sql); pstm.setInt(1, 100); pstm.setInt(2,1); pstm.executeUpdate(); pstm.close(); //======关键,演示一个错误============== /* * 运行该行代码时会报错,不再执行下面代码 * 然后执行catch部分,会执行 rollback(),数据恢复到初始值 * 如果注释掉该行代码,不会报错,会执行 commit(),就提交到数据库 */ int i=1/0; //给李雷账户加上100 String sql2="update account set money=money+? where aid=?"; PreparedStatement pstm2=conn.prepareStatement(sql2); pstm2.setInt(1, 100); pstm2.setInt(2,2); pstm2.executeUpdate(); pstm2.close(); //====关键:上面代码都执行成功,就提交事务,增删改操作才会保存到数据库 //====注意: 数据库连接为 非自动提交 时,不执行此代码,不会保存到数据库 conn.commit(); }catch(Exception e){ //====关键:报错后,就回滚事务,数据恢复到初始值 conn.rollback(); e.printStackTrace(); } conn.close(); ``` 原文出处:http://malaoshi.top/show_1EF4t6gutret.html