JDBC操作事务:
事务:要么都成功,要么都失败;
ACID原则:
原子性:要么都完成,要么都不完成
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库
隔离性会产生问题:
脏读:一个事务读取了另一个没有提交的事务;
不可重复读:在同一个事务内,重复读取表中数据,表数据发生了改变;(每次读取不一样)
幻读:在一个事务内,读取到了别人插入的数据,导致前后读取出来的结果不一样(读者读者变多了)
代码案例:
开启事务;
一组业务执行完毕,提交事务;
可以在catch语句中,显式定义回滚语句,但是默认就会回滚;
/** * 测试JDBC操作事务: * */ public class TestDemo01 { public static void main(String[] args) { Connection conn =null; PreparedStatement st=null; ResultSet rs=null; try { conn= JdbcUtils.getConnection();//获取连接 /** * 操作事务: * 1,关闭数据库的自动提交功能; * 2,业务完毕,提交事务 * 3,如果失败,就回滚事务 */ conn.setAutoCommit(false);//1,关闭数据库的自动提交功能;会自动开启事务 String sql1="update account set money=money-100 where name='A'"; st=conn.prepareStatement(sql1); st.executeUpdate();//执行1 int x=1/0;//报错 String sql2="update account set money=money+100 where name='B'"; st=conn.prepareStatement(sql2); st.executeUpdate();//执行2 //业务完毕,提交事务 conn.commit(); System.out.println("成功"); } catch (SQLException e) { try { System.out.println("失败,回滚事务"); conn.rollback();//如果失败,就回滚事务;不写也会默认回滚 } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); }finally { JdbcUtils.release(conn,st,rs); } } }