搞懂JDBC事务机制,真的很简单

一、关于事务的基本知识

事务是什么

  • 事务通常用于操作数据库,也称数据库事务,数据库事务是由一系列的sql语句组成

事务的特点

  • 事务中的sql语句,要么都执行,要么都不执行

JDBC的事务机制

  • JDBC事务是自动提交的,什么是自动提交呢?
  • 自动提交就是事务的DML(增加、删除、修改)sql语句,执行一次就提交一次结果

但在实际业务中,通过都是N条DML语句共同联合完成的,必须保证在同一事务的DML语句同时完成或同时失败,下面用例子说明

二、JDBC事务机制例子

简单的业务场景

  • 账户111给账户222转钱
  • 执行一个update语句,让账户111从原有的10变成0
  • 执行一个update语句,让账户222从原有的0变成10
  • 如果在这两个update语句中间发生代码异常,
  • 那么根据JDBC事务自动提交,两个账户的钱都会变为0

这种情况在现实生活中发生,那两方不就亏大发了嘛,进一步说公司离倒闭就不远了

三行代码解决上述问题

		//开启事务,将自动提交改为手动提交
		conn.setAutoCommit(false);
		//提交事务
		conn.commit();
		//回滚事务,如果代码没有执行commit方法,事务回滚到之前的状态
		conn.rollback();
三、代码实现
public class JDBCTest11 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try{
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/selfproj?useUnicode=true&characterEncoding=utf8","root","123456");
			
			//开启事务
            //将自动提交机制修改为手动提交
            conn.setAutoCommit(false);

            //创建预编译数据库操作对象
            String sql = "update t_act set balance = ? where actno=?";
            ps=conn.prepareStatement(sql);

            //给?占位符传值
            ps.setDouble(1,0);
            ps.setInt(2,111);
            //1.执行第一个update语句
            int count = ps.executeUpdate();

            //这里发生空指针异常
            String s =null;
            s.toString();

            //给?占位符传值
            ps.setDouble(1,10);
            ps.setInt(2,222);
            //2.执行第二个sql语句
            count+= ps.executeUpdate();

            System.out.println(count==2 ? "转账成功":"转账失败");

            //程序能够走到这里说明以上没有异常,事务结束,手动提交数据
            conn.commit();//提交事务
        }catch (Exception e){
            if (conn != null) {
                try {
                    //回滚事务,如果代码出现异常没有执行commit方法,回滚事务
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }
            e.printStackTrace();
        }finally{
            //释放资源
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

附上sql脚本

		drop table if exists t_act;
		create table t_act(
		    actno int,
		    balance double(7,2)
		);
		insert into t_act(actno,balance) values(111,10);
		insert into t_act(actno,balance) values(222,0);
		commit;
		select * from t_act
四、总结

java中只需要将自动提交事务改为手动提交事务,如果出现代码异常,就回滚到原有的状态

小声bb:原本以为事务是一个高大上的东西,其实在之前自考就学习过,果然实践才是硬道理
对了到mybatis框架时会用到事务哦

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿成长轨迹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值