基于 Spring 的事务处理机制的应用与研究
摘要:文章介绍事务的管理机制及Spring中事务的五种实现方式,对五种实现方式进行分析比较,建议使用基于@Transactional 注解的事务定义方式。
关键词:Spring;事务
中图分类号:TP311.1 文献标识码:A 文章编号:1673-1131(2015)10-0120-02.
0 引言
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作。这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。事务是一个不可分割的工作逻辑单元[1]。
比如,小张账户上有一千元,小李账户上只有一元,现要从小张的帐户转帐一千元到小李的帐户。转帐后余额总和保持不变,为 1001 元。但是完成操作后,小张的帐户没有减少,但小李的帐户却多了一千元,转帐后余额总和变成了 2001 元,为何会多出一千元呢?因为小张帐户原有一千元,减少一千元后为 0 元,违反了银行规定余额不能少于一元的约束,所以终止执行。但后面的语句并没有中断执行,小李的帐户增加了一千元,变为 1001 元。
使用事务就可以帮我们解决以上的问题,因为事务是一个整体。如果其中一步失败了,那整个操作都取消;只有每步都成功了,则整个操作才完成。
1 Spring 事务技术介绍
1.1 Spring 框架技术 Spring是基于控制反转IOC(InversionofControl)和面向方面编程 AOP(AspectOrientedProgramming)的轻量级容器框 架[2]。
Spring 由七个定义良好的模块组成,有 Spring Aop、SpringORM,Spring DAO 等等。每个模块既可单独存在,也可以和其它的模块结合起来实现。组件的关系通过配置 Spring 框架的 applicationContext.xml 联系起来 [3]。Spring 框架带来的好处:面向接口编程,Spring 将使用接口的复杂度降低到零;Spring 框架让代码的测试更简单了等等。
1.2 Spring 事务技术
对于方法级别的事务管理,如果方法在运行过程中出现异常则事务会回滚,如果未出现异常则事务会成功提交。所以,事务管理的主要任务是事务的开始、回滚和提交。通常查询是不需要进行事务管理的,而增删改就必须要用到事务管理了。
Spring 提供声明式事务管理(基于 XML 方式配置事务和基于注解方式管理事务)。声明式事务的优点是不用通过编程的方式就能够管理事务,这样就在业务的代码中就不用掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或在业务方法上进行@Transactional注解,便可以将事务规则应用到业务逻辑中。
基于注解方式管理事务可以对要开启的事务做具体的事务属性配置。所有的方法除非显示声明不开启事务,否则会默认开启事务。基于注解方式管理的事务对于事务传播行为、事务的回滚等事务管理属性的设置也能更为便捷地实现[4]。
2 Spring 的事务配置方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分[5]。
2.1 每个 Bean 都有一个代理
Bean 代理如图 1 所示:
图 1 Bean 代理
2.2 每个 Bean 都有一个代理
(1)定义 LocalSessionFactoryBean 类,id 命名为 id="sessionFactory"。
(2)定义事务管理器,id 命名为 id="transactionManager"。
(3)定义 TransactionProxyFactoryBean 类,id 命名为:id="tBase",方法一的定义是一样的;(4)配置事务管理器,和方法一的区别是只需配置属性transactionManager即可;配置事务属性,和方法一的定义是一样的。
(5)配置 DAO,这是和方法有所区别的:
<bean id="userTarget" class="com.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao" parent="tBase" >
<property name="target" ref="userTarget" />
</bean>
2.3 使用拦截器
使用拦截器如图 2 所示:
图 2 使用拦截器
2.4 使用 tx 标签配置的拦截器
使用 tx 标签配置的拦截器如图 3 所示:
图 3 使用 tx 标签配置的拦截器
2.5 全注解
同样要定义事务管理器。Spring 还提供了@Transactional注解的事务配置,该方式写程序方便,配置文件少,便于维护与管理。如果一个类前加上@Transactional,则表示这类受 spring的事务管理。该类底下的所有业务方法再进行前都要开启事务,结束后都要关闭事务。如果只修饰某个方法则仅对该方法起作用[6]。例如:
@Transactional
public class ADaoImpl implements ADao{
public void delete(){}
} 将
@Transactional 标记在类前,则该类中修饰为 public 的方法都将产生事物管理。
3 结语
Spring 提供了多样化的事务编程支持,包括编程式事务和声明式事务。声明式事务最大的优点是:不用通过编程的方式就能够管理事务,这样在业务的代码中就不用掺杂事务管理的代码。任何事务处理方式都需要有事务管理器的支持。Spring 的编程式事务比较适合对局部操作进行事务处理。如果应用系统中有大量的事务需要处理,则应该使用声明式事务处理。声明式事务处理实现了事务处理与业务逻辑的分离,声明式事务处理依赖 Spring AOP 的功能。上面所介绍的五种方式中的第一种或第二种实现的事务处理,需要为涉及事务处理的每个 Bean 设置一个代理,配置量大,特别是第一种方式配置量更大,用事务拦截器方式执行效率不够理想。在 Spring2.X 时,一般都采用方式三,主要带来的好处就是配置文件的量变小了。在 Spring2.5 时,可以采用方式五了,方式五基于@Transactional 注解的事务定义方法具有配置简单、编程和执行效率高的特点,并且基本实现了 0 配置,是最理想的方式。
参考文献:
[1] 王雨竹,张玉花,张星.SQL Server 2008 数据库管理与开发教程(第 2 版)[M].人民邮电出版社,2012.
[2] 陈平. 基于 Spring 的轻量级 Web 框架的研究与设计 [D]江苏:江苏大学,2005.
[3] 龚尚福.龚琴.冯键.基于 SSH 框架的 EPON 性能管理系统的设计与实现[J].计算机应用,2013(2).
[4] 金导航.基于 Spring 的事务管理研究用[J].电脑知识与技术,2007(11).
[5] Spring 事务配置的五种方式.http://www.blogjava.net/robbie/archive/2009/04/05/264003.html, 2009.
[6] 丁振凡.Spring 3.x 的事务处理机制的研究比较[J].微型机与应用,2012(10).