1.事务:一个多含多个步骤的业务操作。如果这个业务操作被事务管理,则多个步骤要么同时成功,要么同时失败。
2.操作:
1.开启事务
2.提交事务
3.回滚事务
3。使用Connection对象来管理事务
*开启事务;setAutoCommit(boolean autoCommit)调用该方法设置参数为false则为开启事务
*提交事务:commit();
*回滚事务:rollback();
模拟银行转账
一个失去荔枝的女大学生给bkpp赚钱的故事,以防她过度追星,我们设置math异常让事务回顾,让她永远给bkpp赚不了钱,然后报名算法课!!!
代码如下
做的时候遇到问题:给?赋值时候比如(sql中的第鸡个?的值,需要的值)
写的有点不符合逻辑,慢慢看把,测试结果就不放了,代码是没有问题的
package cs.itcast.jdbc; import java.sql.*; public class jdbcshiwu { public static void main(String[] args) { PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; Connection conn = null; //注册驱动 try { Class.forName("com.mysql.cj.jdbc.Driver"); //获取连接对象 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/zzt?serverTimezone=GMT&useSSL=false","root","root"); //定义sql conn.setAutoCommit(false); String sql1 = "update account set balance =balance - ? where name = ?"; String sql2 = "update account set balance =balance + ? where name = ?"; //获取执行sql对象 pstmt1 = conn.prepareStatement(sql1); pstmt2 = conn.prepareStatement(sql2); //执行sql //设置啊参数 pstmt2.setDouble(1,5000); pstmt2.setString(2,"bkpp"); pstmt1.setDouble(1,5000); pstmt1.setString(2,"张润琦"); //执行sql pstmt2.executeUpdate(); //手动制造异常 int i =3/0; pstmt1.executeUpdate(); conn.commit(); } catch (Exception e) { //设置事务回滚 try { if(conn!=null) conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { if(pstmt1!=null) { try { pstmt1.close(); } catch (SQLException e) { e.printStackTrace(); } } if(pstmt2!=null) { try { pstmt2.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }