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);
            }
        }
    }
    
posted @ 2021-05-16 19:54  saxon宋  阅读(48)  评论(0)    收藏  举报