[尚硅谷JDBC核心技术(新版jdbc)]idea考虑事务以后的代码实现总结

该博客讨论了在Java中处理数据库事务的重要性,特别是涉及资金转账操作时。文章指出,事务必须确保AA用户向BB用户转账100时,两者账户余额同步更新,且在异常情况下能够回滚。代码示例展示了如何设置`setAutoCommit(false)`来禁用自动提交,并在出现异常时调用`rollback()`进行回滚。此外,还强调了在关闭连接时防止自动提交的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:

 如上图所示,AA用户给BB用户转账100,也就是说AA用户的账户余额变为900的时候需要BB的账户余额变为1100,这是需要同时处理的事务,两个事务要么同时完成,要么同时失败。这需要使用事务的处理。

数据一旦提交,就不可回滚,下面考虑在什么情况下会自动提交:
哪些操作会导致数据的自动提交?
1、 >DDL操作一执行,都会自动提交。
                 >set autoc ommit =false对DDL操作失效

 2、>DML默认情况下,一旦执行,就会自动提交。
                 >我们可以通过set autocommit = false的方式取消DML操作的 自动提交。 

3、>默认在关闭连接时,会自动的提交数据

通过上面可以看到,最后两点都会导致事务的自动提交,所以代码要顾及两个方面,一个是DML默认情况下的事务自动提交要关闭(conn.setAutoCommit(false))还有一个是当连接关闭时的自动关闭的避免(update中JDBCUtils.closeResource(null,ps))。所以这里需要将之前的增删改update函数进行一些修改,将连接的关闭交给事务处理。

当转账出现异常时,要实现回滚操作,代码在异常里实现,捕捉到异常之后,执行回滚的操作。

代码如下:

package com.atguigu1.transaction;

import com.atguigu1.util.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class TransactionTest {
    public static void main(String[] args) {
        Connection conn= null;
        try {
            conn = JDBCUtils.getConnection();
            System.out.println(conn.getAutoCommit());
            conn.setAutoCommit(false);
            //AA用户给BB用户转账100
            String spl1="update user_table set balance=balance-100 where user=?";
            update(conn,spl1,"AA");

            System.out.println(10/0);//用于模拟异常操作

            String spl2="update user_table set balance=balance+100 where user=?";
            update(conn,spl2,"BB");
            System.out.println("转账成功");
            conn.commit();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }finally {
            JDBCUtils.closeResource(conn,null);
        }
    }
    public static int update(Connection conn,String sql,Object...args){
        PreparedStatement ps= null;
        try {
            ps = conn.prepareStatement(sql);
            for (int i=0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
            }
            return ps.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                conn.setAutoCommit(true);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            JDBCUtils.closeResource(null,ps);
        }
        return 0;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小通信码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值