浅谈Spring事物理解

上一篇以概念形式说明了下什么是事物。本篇将结合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/




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值