作用:多条DML的sql语句看成一个整体,要么都成功,要么都失败。
步骤:
Connection conn=null; PreparedStatement psmt=null; //准备多条sql语句 String sql1=" "; String sql2=" ";.... |
try { //加载jdbc驱动 Class.forName("com.mysql.cj.jdbc.Driver"); |
//获取连接对象,与数据库 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/empDB?serverTimezone=UTC","root",""); |
//设置事务提交方式为手动提交 conn.setAutoCommit(false); |
//获取PreparedStatement命令对象,发送sql语句 psmt=conn.prepareStatement(sql1); |
//获取PreparedStatement命令对象,发送sql语句 psmt=conn.prepareStatement(sql1); //执行sql语句 int row1=psmt.executeUpdate(); //获取PreparedStatement命令对象,发送sql语句 psmt=conn.prepareStatement(sql2); //执行sql语句 int row2=psmt.executeUpdate(); //注意:有几条 sql 就发几次 |
//如果两条sql语句都成功,提交事务 if(row1>0&&row2>0){ System.out.println("..."); //提交事务 conn.commit(); }else{ System.out.println("..."); //回滚事务 conn.rollback(); } |
}catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (SQLException e) { //throw new RuntimeException(e); System.out.println("转账失败..."); //回滚事务 try { conn.rollback(); } catch (SQLException ex) { throw new RuntimeException(ex); } finally { //关闭 try { psmt.close(); } catch (SQLException e) { throw new RuntimeException(e); } try { conn.close(); } catch (SQLException e) { throw new RuntimeException(e); } } | |
1. 设置提交方式为手动提交,等价与start transaction conn.setAutoCommit(false); 2. 提交事务 conn.commit(); 3. 回滚事务 conn.rollback(); |
四大特性:CRID 原子性、一致性、隔离性、持久性