JDBC 事务处理【最终版】

2024-05-23 07:18
文章标签 jdbc 事务处理 最终版

本文主要是介绍JDBC 事务处理【最终版】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。
事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。
当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。 

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

JDBC 事务处理
    为了让多个 SQL 语句作为一个事务执行:
  • 调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
  • 在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
  • 在出现异常时,调用 rollback(); 方法回滚事务
  • 若此时 Connection 没有被关闭, 则需要恢复其自动提交状态

// AA  用户转给  BB  用户  100 元。  1.AA  用户   扣除  100 2.BB 用户增加  100
@Test
      public   void  testUpdate2  ()   {
        Connection conn  =   null  ;
          try   {
            conn  =  JDBCUtils  . getConnection  ();
              // 1.  开启事务
            conn  . setAutoCommit  (  false );
            String sql1  =   "update user_table set balance = balance - ? where user = ?" ;
            updateWithTx  ( conn  ,  sql1  ,   100  ,   "AA" );

              //  模拟网络异常
              // System.out.println(10 / 0);

            String sql2  =   "update user_table set balance = balance + ? where user = ?" ;
            updateWithTx  ( conn  ,  sql2  ,   100  ,   "BB" );
              // 2.  提交事务
            conn  . commit  ();
          }   catch   ( Exception e  )   {
            e  . printStackTrace  ();
              if   ( conn  !=   null  )   {
                  try   {
                      // 3.  回滚事务
                    conn  . rollback  ();  // 出现异常则直接会执行  catch  中的内容,然后使之前对数据库的操作回滚
                  }   catch   ( SQLException e1  )   {
                    e1  . printStackTrace  ();
                  }
              }
          }   finally   {
            JDBCUtils  . close  (  null ,  null ,  conn );
          }
      }

      //  通用的增删改方法(  version 3.0   :  考虑上数据库事务
      public   void  updateWithTx  ( Connection conn  ,  String sql  ,  Object ...  args )  {

          // 1.  返回一个 PreparedStatement  的对象,涉及预编译  sql  语句
        PreparedStatement ps  =   null  ;
          try   {
            ps  =  conn  . prepareStatement  ( sql  );
              // 2.  填充占位符
              for   (  int  i  =   0 ;  <  args  . length  ;  i  ++)   {
                ps  . setObject  ( +   1  ,  args  [ i  ]); //  设置占位符
              }
              // 3.  执行
            ps  . executeUpdate  ();
          }   catch   ( Exception e  )   {
            e  . printStackTrace  ();
          }   finally   {
              // 4.  关闭操作
            JDBCUtils  . close  (  null ,  ps  ,   null );  //  注意连接不能关,否则会有语句执行不到
          }
      }


这篇关于JDBC 事务处理【最终版】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996173

相关文章

滚雪球学Java(87):Java事务处理:JDBC的ACID属性与实战技巧!真有两下子!

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~ 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!! 环境说明:Windows 10

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

VC环境下字符串转整型最终版

剑指Offer 字符串转化为整型 今天闲来无事,就搜了下这方面的知识,结果发现,这个题就是一个经典的算法题,在剑指Offer里已经详细分析了 直接上代码了,运行可靠,如果大家继续深入理解的话,参考这本书:《剑指Offer——名企面试官精讲典型编程题》 博主:http://blog.csdn.net/cadcisdhht/article/details/36875535 ---------

jdbc连接数据库使用sid和service_name的区别 ?

问题描述: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was: 10.12.162.84:1521:xxxx  oracle数据的tnsnames.ora中配置的是:SERVICE

Java项目中,配置打印 JDBC 日志的几种方法

在 IDEA 项目中,如果你想打印 JDBC 日志,可以通过配置日志框架(如 Logback 或 Log4j)来实现。Spring Boot 使用的默认日志框架是 Logback,你可以通过在 application.yml 文件中配置日志级别来打印 JDBC 日志。 方法 1: 使用 application.yml 配置 JDBC 日志 logging:level:# 显示 SQL 语句co

基于shard-jdbc中间件,实现数据分库分表

一、水平分割 1、水平分库 1)、概念: 以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中。 2)、结果 每个库的结构都一样;数据都不一样; 所有库的并集是全量数据; 2、水平分表 1)、概念 以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中。 2)、结果 每个表的结构都一样;数据都不一样; 所有表的并集是全量数据; 二、Shard-jdbc 中间件 1、架构图 2、特点

基于Shard-Jdbc分库分表,数据库扩容方案

一、数据库扩容 1、业务场景 互联网项目中有很多“数据量大,业务复杂度高,需要分库分表”的业务场景。 这样分层的架构 (1)上层是业务层biz,实现业务逻辑封装; (2)中间是服务层service,封装数据访问; (3)下层是数据层db,存储业务数据; 2、扩容场景和问题 当数据量持续新增,面临着这样一些需求,两台数据库无法容纳,需要数据库扩容,这里选择2台—扩容到3台的模式,如下图

Java笔试面试题AI答之JDBC(3)

文章目录 13. 编写JDBC连Oracle的程序?14. 简述JDBC的主要组件有哪些 ?15. JDBC中如何防止SQL注入攻击?1. 使用预处理语句(PreparedStatement)2. 避免在SQL查询中直接拼接用户输入的数据总结 16. JDBC的脏读是什么?哪种数据库隔离级别能防止脏读?脏读(Dirty Read)哪种数据库隔离级别能防止脏读? 17. 简述JDBC ex

JavaBug系列- Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class load

JavaBug系列之Mysql驱动问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 Java/一对一零基础辅导/企业项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 V:study_51ctofx 一、关于错误信息 APPLICATION FAILED TO START Description: Fai