Java-JDBC-实现事务管理
目录
文章目录
内容
-
步骤:
- 开启事务
- setAutocommit(boolean autoCommit)
- true: 自动提交
- false:手动提交即开启事务
- setAutocommit(boolean autoCommit)
- 正常提交
- commit()
- 异常回滚
- rollback()
- 开启事务
-
示例:模拟银行账户转账,张三账户给李四账户转500块钱
-
account表图示:
-
未开启事务代码1-1:
package cn.gaogzhen.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import cn.gaogzhen.util.JDBCUtils; public class JDBCDemo9 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm1 = null; PreparedStatement pstm2 = null; String name1 = "张三"; String name2 = "李四"; double money = 500; try { // 1、 获取连接对象Connection conn = JDBCUtils.getConnection(); // 2. sql语句 String sql1 = "update account set balance = balance - ? where name = ?"; String sql2 = "update account set balance = balance + ? where name = ?"; // 3. 获取预处理sql语句PreparedStatement的对象 pstm1 = conn.prepareStatement(sql1); pstm2 = conn.prepareStatement(sql2); // 4. ?赋值 pstm1.setDouble(1, money); pstm1.setString(2, name1); pstm2.setDouble(1, money); pstm2.setString(2, name2); // 5. 执行SQL操作 pstm1.executeUpdate(); // 模拟异常 int x = 5/0; pstm2.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { // 6. 释放资源 JDBCUtils.close(pstm1, conn); JDBCUtils.close(pstm2, null); } } }
测试结果:
-
解析:这显然不合理的,我们系统出现异常,余额恢复正常
-
开启事务代码1-2:
package cn.gaogzhen.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import cn.gaogzhen.util.JDBCUtils; public class JDBCDemo9 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstm1 = null; PreparedStatement pstm2 = null; String name1 = "张三"; String name2 = "李四"; double money = 500; try { // 1、 获取连接对象Connection conn = JDBCUtils.getConnection(); // 开启事务 conn.setAutoCommit(false); // 2. sql语句 String sql1 = "update account set balance = balance - ? where id = ?"; String sql2 = "update account set balance = balance + ? where id = ?"; // 3. 获取预处理sql语句PreparedStatement的对象 pstm1 = conn.prepareStatement(sql1); pstm2 = conn.prepareStatement(sql2); // 4. ?赋值 pstm1.setDouble(1, money); pstm1.setInt(2, 1); pstm2.setDouble(1, money); pstm2.setInt(2, 2); // 5. 执行SQL操作 pstm1.executeUpdate(); // 模拟异常 int x = 5/0; pstm2.executeUpdate(); // 业务完成正常提交 conn.commit(); } catch (Exception e) { // 业务异常,回滚 try { if(conn != null) conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { // 6. 释放资源 JDBCUtils.close(pstm1, conn); JDBCUtils.close(pstm2, null); } } }
测试结果:
- 提示:JDBCUtils工具类为博文"JDBCUtils工具类"内编写的代码
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA