企业级应用系统在更新数据库数据时,一般都采用数据库事务处理,以确保数据库数据的一致性。本文主要讨论在Spring框架中如何使用数据库事务处理更新数据库数据。通过本课的学习,可以达到如下目标。

● 了解JDBC对数据库事务处理的支持

● 掌握在Spring框架中使用事务处理的技术

事务处理对数据库来说,是对数据库的一系列SQL语句操作,这些操作被组织为一个事务。事务具有原子性,即事物中的操作要么全部执行,要么全部不执行。若事务中的SQL语句在执行过程中发生错误,事务需要对已经执行的SQL语句进行回滚操作,撤销先前对数据库的操作,防止数据库出现错误状态。

例如,在课程案例mooc数据库中,一个业务是学生购买课程,购买课程业务步骤包括更新teacher表,记录老师的收入,同时student_course表增加一条购买记录,更新student表的余额字段。上述业务步骤需要全部执行完毕,才能反映出学生购买课程的正确状态。如果因意外情况,上述操作仅成功执行了部分SQL语句,其它语句没有执行或执行失败,就会造成学生购买课程这个业务记录不完整,数据库处于数据错乱状态。若利用数据库事务技术执行上述操作,当发生上述情况时,数据库系统会将先前执行的SQL语句撤销,将数据库回滚到事务执行前状态。

1、JDBC对数据库事务处理的支持

JDBC本身就提供了对数据库事务处理的支持,使用java.sql.Connection对象完成事务的提交。使用Connection提交数据库事务处理代码如下。

Connection类的setAutoCommit方法用于设置JDBC提交SQL语句的方式。设置为ture时,JDBC自动提交SQL语句,JDBC提交SQL语句的方式默认为true。设置为false时,SQL语句的提交由应用程序负责,应用程序必须调用commit方法,同时要在执行SQL语句异常处理块中调用rollback方法,对异常发生前进行的数据库进行回滚操作。

在企业级应用中,事务一般是并发执行的,当事务并发执行时,就会发生数据库数据同步的问题,具体问题可分为下面四种类型。

(1)脏读:一个数据库事务在更新数据的过程中,数据是保存在内存中的,只有调用commit方法,更新的数据才最终写到数据库中。如果一个事务使用了另一个事务更新但没保存的数据,这个数据就称为脏数据,事务读取这个数据就称为脏读。

(2)不可重复读:在同一事务中,两次读取同一记录,读取的记录内容却不相同。例如,事务A第一次读取了一条记录,同时事务B更新并提交了该条记录,事务A第二次读取该条记录时,当前读取的记录内容和第一次读取的记录内容不相同。

(3)幻读:当事务A对表中的所有记录进行了修改,同时事务B又在表中插入了一条新的记录。A事务在后续对该表操作时,就会发现表中还存在没有修改的记录,就好象发生了幻觉一样。

(4)丢失更新:当事务A和事务B对同一数据进行修改时,就会发生丢失更新的问题。例如,B事务对m记录进行了修改,A事务在修改m记录时发生异常并回滚,就会将B事务对m记录的修改覆盖掉。

为了解决上面提到的事务并发问题,JDBC定义了五种事务隔离级别来解决来解决这些并发导致的问题。

表1 JDBC提供的事务隔离级别说明

表中隔离级别从上到下依次增高,最高级别是TRANSACTION_SERIALIZABLE,它通过强制事务串行执行(不是并行),避免了事务并发执行导致发生的数据同步问题。出于应用程序访问数据库性能的考虑,一般设置隔离级别为TRANSACTION_READ_COMMITTED。

2、在Spring框架中调用事务处理

下面给出具体执行事务处理的案例程序。案例程序的数据源采用mooc数据库,mooc数据库的结构以及本案例中没有列出的代码详见《Spring使用JDBC访问MySQL数据库》一文。

让Spring框架开始执行一个数据库事务时,需要分成三步走。第一步配置数据源DataSource;第二步声明事务管理TransactionManager类;第三步定义可以执行事务的DAO类。

第一步:配置数据源DataSource

需要让Spring框架知道数据库的位置及其连接方式,这个工作由DataSource完成。Spring框架通过DataSource连接数据库,DataSource既可以在Spring框架的配置文件中配置,也可以放在Bean类中配置。下面是在Spring配置文件中配置数据源的代码。

配置语句定义了MySQL数据库的URL地址、访问账户及访问密码。

第二步:声明事务管理TransactionManager

Spring 框架提供了PlatformTransactionManager作为事务管理类的顶层接口,声明了初始化事务、提交事务、回滚事务等接口。接口实现由具体的数据库驱动类实现。具体包括DataSourceTransactionManager、HibernateTransactionManager等实现类。本文主要用DataSourceTransactionManager来实现事务的管理。在Spring框架配置文件中配置DataSourceTransactionManager类。

声明DataSourceTransactionManager类,需要传入之前已声明的DataSource数据源。

第三步:定义可以执行事务的DAO类

DAO提供了应用程序访问数据源必要的接口和方法,接口和方法的具体实现细节,程序并不需要了解。DAO的具体细节详见《Spring使用JDBC访问MySQL数据库》一文。

CourseTransactio类实现了CourseDao接口,CourseDao是访问mooc数据库的顶层接口,接口提供了mooc数据库表的增删改查操作。CourseTransactio主要实现了CourseDao类的buyCourse,实现学生购买课程事务。购买课程事务涉及到更新teacher表,在student_course表增加一条购买记录,更新student表的余额字段数据库操作,这些操作需要进行连续处理,中间不能中断出错,如果出错则需要做回滚处理。 因此,buyCourse方法采用数据库事务进行处理。

事务处理从TransactionDefinition开始,前面我们谈到了事务的隔离级别,TransactionDefinition就是用来定义事务隔离级别的。DefaultTransactionDefinition表示使用数据库的默认隔离级别,对大部分数据库而言,默认隔离级别是TRANSACTION_READ_COMMITTED。

当TransactionDefinition 创建后,可以通过调用 getTransaction方法开始事务,该方法会返回 TransactionStatus 的一个实例。 TransactionStatus 用于追踪当前的事务状态,如果后面的SQL语句都运行成功,可以使用 TransactionManager 的 commit() 方法来提交这个事务,否则使用 rollback() 方法来回滚整个操作。

完整的配置文件代码。

学生实体类代码。

老师实体类代码。

student表映射到学生实体类。

teacher表映射到老师实体类。

测试类代码。

课程小结

(1)事务处理对数据库来说,是对数据库的一系列SQL语句操作,这些操作被组织为一个事务。事务具有原子性,即事物中的操作要么全部执行,要么全部不执行。若事务中的SQL语句在执行过程中发生错误时,事务需要对已经执行的SQL语句进行回滚操作,撤销先前对数据库的操作,防止数据库出现错误状态。

(2)让Spring框架开始执行一个数据库事务时,需要分成三步走。第一步配置数据源DataSource;第二步声明事务管理TransactionManager类;第三步定义可以执行事务的DAO类。

使用Spring框架实现数据库事务处理相关推荐

  1. 使用Spring框架+前端技术实现简易的留言系统

    文章目录 提要 阅读准备 数据库的简易构建 带数据的数据库结构sql语句 创建序列 创建表及导入数据 导入后的数据 后端代码实现 首先配置Spring框架文件 SpringMvc.xml Spring ...

  2. 史上最全面最易懂的,Spring框架学习教程

    Spring通过PlatformTransactionManager平台事务管理器接口对事务的管理进行高度抽象,但是该接口下具体的实现是由各个平台自己实现,Spring并不直接管理事务,而是提供了多种 ...

  3. 大数据WEB阶段Spring框架(三)声明式事务处理

    Spring整合JDBC-声明式的事务处理 一.Spring整合JDBC步骤 导入jar包 编写数据库配置文件 也可以将数据库配置信息单独配置后引入Spring容器中 代码中使用 二.Spring框架 ...

  4. MySQL数据库事务、mybatis框架、spring框架、springmvc框架、永和大王门店管理系统(框架第二部分)

    第十二章 MySQL数据库事务 一. 事务及四大特性 1.什么是事务 数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行 ...

  5. 使用Spring框架的好处

    转自:https://www.cnblogs.com/hoobey/p/6032506.html 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JD ...

  6. 使用Spring框架的好处(转帖)

    在SSH框架中使用Spring的好处 在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书 ...

  7. Spring框架的前世今生以及对Spring的宏观认识

    Spring 的前世今生 相信经历过不使用框架开发 Web 项目的 70 后.80 后都会有如此感触,如今的程序员开发项目太轻松 了,基本只需要关心业务如何实现,通用技术问题只需要集成框架便可.早在 ...

  8. Spring 系列: Spring 框架

    第一部分:Spring 框架简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序 ...

  9. python spring框架_Spring Python

    Spring Python Spring Python是基于Java的Spring框架(Spring Framework)和Spring安全(Spring Security)的一个分支,它以Pytho ...

最新文章

  1. nginx配置参数详解
  2. Flask实战2问答平台-登录限制(装饰器)
  3. java springmvc mybatis mysql
  4. 《剑指offer》用两个栈实现队列
  5. N个数中选择M个数的组合(1MN)
  6. 2、异步HTTP编程
  7. 为什么大厂都在用 GO 语言?读透 GO 语言的切片
  8. UC:我们是怎么做出 Chromium M35 内核浏览器
  9. java缓存管理器_使用@EnableCaching的Spring Boot默认缓存管理器
  10. 具有Eclipse和嵌入式JBoss HornetQ Server的简单JMS 1.1生产者和使用者示例
  11. 三丈红尘,八千里风月
  12. 现代几何学在计算机科学中的应用,CNCC2017
  13. 微信付款到个人银行卡php,微信企业付款到银行卡(下)
  14. mysql中1和0分别代表什么
  15. nRF52832-Beacons测距离
  16. php职教云答案,职教云答案查询软件下载,职教云提前看答案,职教云php作业答案...
  17. AutoJs学习-读写手机联系人
  18. [HarekazeCTF2019]Sqlite Voting
  19. The Cook and the Chef: Musk’s Secret Sauce
  20. 问题 G: 差值求和 (差分)

热门文章

  1. .NET的资源并不限于.resx文件,你可以采用任意存储形式[上篇] (转载)
  2. PDF N-Up Maker:一个把PDF转成小册子或者把多个页面放到一个页面上的工具(免费,免Acrobat,命令行模式)...
  3. NHibernate的关键点精要
  4. 开始使用Google Analytics 示例
  5. 华农c语言实验1007答案,华农C语言题目及答案(完整版).docx
  6. java ztree json_java递归实现ztree树结构数据展示
  7. red hat linux 安装oracle10g vm,oracle 10g 在 RED HAT ENTERPRISE LINUX 5下的安装
  8. php获得对象的类型,php 类型(对象)提示
  9. linux隐藏tomcat版本_Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型
  10. Delphi获得计算机系统配置,用Delphi获取本地计算机名称和IP地址