JDBC管理实务的概述和实现
JDBC管理实务的概述
事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这对个步骤要么同时成功,要么同时失败。
操作:
1、开启事务
2、提交事务
3、回滚事务
使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit): 调用方法设置参数为false,即开启事务
在执行sql之前开启事务
提交事务:commit()
在所有sql都执行完毕后提交事务
回滚事务:rollback()
在catch中回滚事务
JDBC管理实务的实现
/** * 事务操作 */ public class JDBCDemo10 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; try { //1.获取连接 conn = JDBCUtils.getConnection(); //2.定义sql //张三 -500 String sql1 = "update account set balance = balance - ? where id = ?"; //李四 +500 String sql2 = "update account set balance = balance + ? where id = ?"; //3.获取执行sql对象 pstmt1 = conn.prepareStatement(sql1); pstmt2 = conn.prepareStatement(sql2); //4.设置参数 pstmt1.setDouble(1,500); pstmt1.setInt(2,1); pstmt2.setDouble(1,500); pstmt2.setInt(2,2); //5.执行sql pstmt1.executeUpdate(); int i = 3/0; pstmt2.executeUpdate(); } catch (SQLException throwables) { throwables.printStackTrace(); }finally { JDBCUtils.close(pstmt1,conn); JDBCUtils.close(pstmt2,null); } } }
当代码执行完第一条sql之后程序报错,第二条sql没有执行,张三的金额已经减了,但是李四的金额没有增加。
所以我们要使用事务来解决
解决方式:
/** * 事务操作 */ public class JDBCDemo10 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; try { //1.获取连接 conn = JDBCUtils.getConnection(); //开启事务 conn.setAutoCommit(false); //2.定义sql //张三 -500 String sql1 = "update account set balance = balance - ? where id = ?"; //李四 +500 String sql2 = "update account set balance = balance + ? where id = ?"; //3.获取执行sql对象 pstmt1 = conn.prepareStatement(sql1); pstmt2 = conn.prepareStatement(sql2); //4.设置参数 pstmt1.setDouble(1,500); pstmt1.setInt(2,1); pstmt2.setDouble(1,500); pstmt2.setInt(2,2); //5.执行sql pstmt1.executeUpdate(); int i = 3/0; pstmt2.executeUpdate(); //提交事务 conn.commit(); } catch (Exception throwables) { //事务的回滚 try { if (conn!=null){ conn.rollback(); } } catch (SQLException e) { e.printStackTrace(); } throwables.printStackTrace(); }finally { JDBCUtils.close(pstmt1,conn); JDBCUtils.close(pstmt2,null); } } }
执行之后代码找样会报错
但是数据库中的内容没有发生变化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix