JDBC操作事务
JDBC操作事务
-
要么都成功要么都失败
-
ACID原则
- 原子性:要么全部完成,要么都不完成
- 一致性:总数不变
- 持久性:一旦提交不可逆,持久化到数据库了
- 隔离性:多个进程互不干扰
隔离性的问题
- 脏读:一个事务读取另一个没有提交的事务
- 不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了变化
- 虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后读取出来的结果不一致
代码实现
- 第一步:开启事务(conn.setAutoCommit(false);)
- 第二步:一组业务执行完毕后,提交事务(conn.commit();)
- 第三步:可以在catch语句中显示的定义回滚语句,但默认失败也会回滚(conn.rollback();)
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class Test01 { public static void main(String[] args) { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { conn = jdbcUtils.getConnection(); //关闭数据库的自动提交,自动会开启事务 conn.setAutoCommit(false); //开启事务 String sql1 = "update users set name = 'A' where id = 1"; st = conn.prepareStatement(sql1); st.executeUpdate(); String sql2 = "update users set name = 'A' where id = 2"; st = conn.prepareStatement(sql2); st.executeUpdate(); conn.commit(); //业务完毕,提交事务 System.out.println("成功!"); } catch (Exception e) { //如果失败则回滚事务 try { conn.rollback(); //就算没有此句,如果失败也是默认回滚 } catch (Exception throwables) { throwables.printStackTrace(); } e.printStackTrace(); } finally { conn.setAutoCommit(true); //关闭事务 jdbcUtils.release(conn,st,rs); } } }

浙公网安备 33010602011771号