1、事务
一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2、操作
1. 开启事务
2. 提交事务
3. 回滚事务
3、使用Connection对象来管理事务
1. 开启事务:void setAutoCommit(boolean autoCommit)调用该方法设置参数为false,即开启事务。默认事务关闭。
在执行sql之前开启事务
2. 提交事务:commit()
当所有sql都执行完提交事务
3. 回滚事务:rollback()
在catch中回滚事务
4、代码
package cn.itcast.jdbc; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; /** * 事务操作 */ public class JDBCDemo12 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstat1 = null; PreparedStatement pstat2 = null; //1. 获取连接 try { conn = JDBCUtils.getConnection(); //开启事务 conn.setAutoCommit(false); //2. 定义sql //2.1 zhangsan -500 //2.2 lisi + 500 String sql1 = "update account set balance = balance - ? where id = ?"; String sql2 = "update account set balance = balance + ? where id = ?"; //3. 获取执行sql的对象 pstat1 = conn.prepareStatement(sql1); pstat2 = conn.prepareStatement(sql2); //4. 给?赋值,设置参数 pstat1.setDouble(1,500); pstat1.setDouble(2,1); pstat2.setDouble(1,500); pstat2.setDouble(2,2); //5. 执行sql pstat1.executeUpdate(); //手动制造异常 int i = 3/0; pstat2.executeUpdate(); //提交事务 conn.commit(); } catch (Exception e) { //事务回滚 try { if(conn != null){ conn.rollback(); } } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } finally { JDBCUtils.close(pstat1,conn); JDBCUtils.close(pstat2,null); } } }
执行结果:
执行完仍旧会报异常,查询数据库发现数据未更新