数据库事务详解

事务处理

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。在jdbc中的事务是使用connection的commit方法和rollback方法来管理的。

在jdbc中事务的默认提交时机,如下:

  • 当一个连接对象被创建时,默认情况下是【自动提交事务】,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,此操作不能回滚。

  • 关闭数据库连接,数据就会【自动提交】。如果多个操作(多条sql语句),每个操作使用的是自己单独的连接(connection),则无法保证事务。【同一个事务】的【多个操作】必须在【同一个连接】下。

在jdbc中使用的基本步骤:

  1. 调用 Connection 对象的 setAutoCommit(false) 以取消自动提交事务

  2. 在所有的 SQL 语句都成功执行后,调用 commit()方法提交事务

  3. 在出现异常时,调用 rollback()方法回滚事务

  4. 若此时 Connection 没有被关闭,还可能被重复使用,则需要恢复其自动提交状态 setAutoCommit(true)

下面是实现代码思想:


    @Override
    //这是一个转账的案例
    //一个人收钱,另一个人的钱就会减少,这两个动作要一起完成,
    //不能一个减少了,另一个却没有增加
    public int transfer(int id ,int money) {
        Connection connection = null;
        //预编译
        PreparedStatement statement = null;
        String sql = "update user set balance = balance + ? where id = ?";
        try {
            connection = DBUtil.getConnection();
            //1.开启事务
          connection.setAutoCommit(false);
            //发送sql预编译请求
            statement = connection.prepareStatement(sql);
            //使用预编译变量
            statement.setInt(1,money);
            statement.setInt(2,id);
            int rows  = statement.executeUpdate();
            //2.上面代码无误进行提交
            connection.commit();
            return rows;
        }catch (Exception e){
            e.printStackTrace();

            //3.代码出现错误,进行回退
            try {
              connection.rollback();
           } catch (SQLException ex) {
               ex.printStackTrace();
            }
            return  -1;
        }finally {
            DBUtil.closeAll(connection,statement,resultset);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值