事务是构建可靠企业级应用程序的最关键部分之一。
最常见的事务类型是数据库操作。
在典型的数据库更新操作中,首先数据库事务开始,然后数据被更新,最后提交或回滚事务(根据数据库操作的结果而定)。但是,在很多情况下,由于应用程序需求以及应用程序需要与之交互的后端资源(如RDBMS、面向消息的中间件、ERP系统等)的不同,事务管理可能更加复杂。
Spring支持声明式和编程式事务管理。
Spring声明性事务提供极好的支持,这意味着不需要将事务管理代码和业务逻辑混淆起来。
所要做的就是声明必须参与事务的相关方法(在类或层中)以及事务配置的细节,Spring将负责处理事务管理。
- Spring事务抽象层:讨论Spring事务抽象类的基本组件,并解释如何使用这些类来控制事务的属性。
- 声明式事务管理:演示如何使用Spring和简单的Java对象来实现声明式事务管理,提供使用XML配置文件以及Java注解的声明式事务管理示例。
- 编程式事务管理:尽管编程式事务管理并不经常使用,但本章还是介绍了如何使用Spring提供的TransactionTemplate类,它可以让开发人员完全控制事务管理代码。
- 使用JTA实现全局事务:对于需要跨越多个后端资源的全局事务,演示如何使用JTA在Spring中配置和实现全局事务。
事务类型
本地事务易于管理,如果应用程序中的所有操作都需要与一个事务资源(如JDBC连接)进行交互,那么使用本地事务就足够了。
但是,如果没有使用像Spring这样的应用程序框架,则需要编写大量的事务管理代码,并且如果将来事务的范围需要扩展到跨多个事务资源,就必须删除本地事务管理代码并重新编写代码,以便使用全局事务。
在Java世界中,全局事务是通过JTA实施的。
在这种情况下,与JTA兼容的事务管理器通过各自的资源管理器连接到多个事务资源,而这些资源管理器能够通过XA协议(一种定义了分布式事务的开放标准)与事务管理器进行通信,并使用2 Phase Commit(2PC)机制来确保所有后端数据源被更新或完全回滚。
如果任意后端资源失败,则整个事务将回滚,因此对其他资源的更新也会回滚。
隔离级别
传播类型
TransactionStatus接口
下面所示的TransactionStatus接口允许事务管理器控制事务的执行。这些代码可以检查事务是新事务还是只读事务,并且可以启动回滚。
TransactionStatus接口中的方法非常容易理解;最值得注意的是setRollbackOnly()方法,它会导致回滚并结束活动事务。
hasSavePoint()方法指示事务内部是否携带保存点(也就是说,事务是基于保存点而创建的嵌套事务)。
如果可用(例如,与Hibermate一起使用时),flush()方法会将底层会话存储到数据存储区。
isCompleted()方法指示事务是否结束。