我是靠谱客的博主 自然小熊猫,最近开发中收集的这篇文章主要介绍搞懂JDBC事务机制,真的很简单,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

        • 一、关于事务的基本知识
        • 二、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框架时会用到事务哦

最后

以上就是自然小熊猫为你收集整理的搞懂JDBC事务机制,真的很简单的全部内容,希望文章能够帮你解决搞懂JDBC事务机制,真的很简单所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部