Andrea0 2020-04-17
1.概述:事务指的是逻辑上的一组操作,组成这组操作的单元,要不同时成功,要不同时失败 2.作用:保证在一个事务中,多次SQL操作要么同时成功,要么同时失败
*事务管理流程 1.开启事务 2.执行多条SQL语句,如果没有出现错误,提交事务,将数据持久化存储到数据库 3.执行多条SQL语句,如果出现错误,回滚事务,将事务状态回滚到开启事务之前 4.关闭资源 *JDBC事务操作 与事务操作相关的方法,都定义在java.sql.Connection接口中 public void setAutoCommit(boolean flag):将此连接的自动提交模式为给定状态的flag **当flag=true:表示自动提交 **当flag=fasle:表示手动提交,开启事务 public void commit():将数据持久化提交到数据库 public void rollback: 回滚事务 *步骤: 1.获取Conection连接对象 2.开启事务 setAutoCommit(false) 3.定义sql语句 4.获取PreparedStatement对象 5.执行sql语句,获得结果 6.如果sql语句正常执行,没有问题,提交事务 7.处理结果 8.如果sql语句执行错误,回滚事务 9.关闭资源 *代码体现: public class Jdbc_affairDemo8 { public static void main(String[] args) { Connection conn = null; PreparedStatement pstmt1 = null; PreparedStatement pstmt2 = null; //1. 获取连接 try { conn = JDBCUtils.getConnection(); // 建立连接后开启事务 conn.setAutoCommit(false); //2. 定义sql //2.1 张三 - 500 String sql1 = "update account set balance = balance - ? where id = ?"; //2.2 李四 + 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 (SQLException e) { // 事务回滚 if (conn != null) { try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } e.printStackTrace(); } finally { JDBCUtils.close(pstmt1, conn); JDBCUtils.close(pstmt2, null); } }
}