上一篇以概念形式说明了下什么是事物。本篇将结合Spring来说下具体的事物在开发中运用场景。
依据Spring官方文档可知Spring事物管理高层主要包含以下3个接口:
PlatformTransactionManager(事物管理器):(实际开发过程中最常用的事物管理器)
DataSourceTransactionManager(使用springjdbc或ibats时常用), HibernateTransactionManager(主要是针对hibernate做持久化层时使用)
TransactionDefinition(事物定义信息:隔离,传播,超时,只读)
事物隔离级别:
引入几个概念:
(1) 脏读:一个事物读取另一个事物改写但还未提交的数据。当这些数据回滚时,读取到的数据是无效的;
例如:A商品的库存为20件,事物一购买2件,将A商品库存修改为18件,并未提交事务。
此时:事物二读取到商品的库存,读取到的库存为18件。
随后:事物一发生异常,导致事物回滚,此时A商品库存仍然是20件。
最后导致事物二读取到的库存为18.此时事物二读取数据即为脏读。
(2) 不可重复读:一个事物中读取到另一个事物已经更新的数据。从而导致该事物多次查询结果不一致。
例如:事物一 第一次可能是读取到事物二更新的数据,下次可能读取事物三更新的数据。导致多次读取数据不一致即为不可重复读。
(3) 幻读 :事物一 读取a表数据 此时事物二向a表中插入若干条条记录。导致后来事物一再次查询时发现一些原来没有读取的记录即为幻读。
由于以上问题的存在:TransactionDefinition 提供四种事物隔离级别解决以上问题。
Default:使用后端数据库默认的隔离级别(Spring中的选择项)
Read_uncommited :允许读取还未提交的改变数据 导致脏,幻,不可重复读。
READ_COMMITTED:允许在并发事物已提交后读取。可防止脏读,但幻读和不可重复读仍可发生(oracle)
REPEATABLE_READ:对相同数据字段多次读取是一致的,除非数据被事物本身改变。可防止脏,不可重复读,但幻读仍可发生。(mysql默认)
SERIALIZABLE:完全服从ACID的隔离级别。确保不发生脏,幻,不可重复读。但是最慢。典型完全通过锁定数据表完成。
事物传播特性
7种传播特性分三类(1.2.3 4.5.6 7):三类是指:(1)将不同时事物处理放到一个事物 (2)。不同事物不放到同一事物 (3) 不同事物嵌套执行
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务
实例:service1(){ dao1(){
dao1.aa(); aa() }
}
service2(){ dao2(){
dao2.bb } bb() }
情况:复杂业务场景需要调用service1和service2才能同时完成。此时就存在事物执行的问题,涉及到事物传播特性配置
1.2.3 传播特性:支持当前事物,区别 1 没有则开启新事物 2没有就不执行事物 3没有就抛异常
4.5.6 传播特性:则是侧重挂起事物
7 传播特性:嵌套执行事物,事物一执行时,定义执行点。当执行事物二时,如果出错则回滚到原始状态或者或滚到事物二执行之处的状态。
实际项目中事物实现方式:
(1)编程式事务管理:需要手动编写代码,在实际开发中很少使用
(2)声明式事务管理:
(2.1)基于TransactionProxyFactoryBean的方式,需要为每个进行事务管理的类做相应配置
(2.2)基于AspectJ的XML方式,不需要改动类,在XML文件中配置好即可
(2.3)基于注解的方式,配置简单,需要在业务层类中添加注解
(2.2)和(2.3)在开发中使用比较多,前者配置一目了然,可以在XML文件中得到所有信息,后者配置简单方便
具体可参考:http://blog.csdn.net/bazingaea/article/details/53133620
推荐文章:https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/