码迷,mamicode.com
首页 > 编程语言 > 详细

Spring的事务管理

时间:2015-11-30 18:19:15      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:spring 事务传播性

 

事务就是将一系列的动作当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不管用

  

事务的四个关键属性(ACID):

原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用.

–一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中.

–隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏.

–持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中.

配置事务三步骤:配置事务管理器,配置注解驱动,在方法上加入@Transactional注解

 <!-- 配置事务管理器 -->
<!--jdbc事务管理器是DataSourceTransactionManager
    Hibernate的事务管理器是HibernateTransactionManager-->
 <bean id="transactionManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>
 
 <!-- 启用事务注解 -->
 <tx:annotation-driven transaction-manager="transactionManager"/>

 

事务传播属性

当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行

下图是默认情况

技术分享

 

技术分享

 

用XML方式配置事务

 <!-- 1. 配置事务管理器 -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"></property>
 </bean>
 
 <!-- 2. 配置事务属性 -->
 <tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
   <!-- 根据方法名指定事务的属性 -->
   <tx:method name="purchase" propagation="REQUIRES_NEW"/>
   <tx:method name="get*" read-only="true"/>
   <tx:method name="find*" read-only="true"/>
   <tx:method name="*"/>
  </tx:attributes>
 </tx:advice>
 
 <!-- 3. 配置事务切入点, 以及把事务切入点和事务属性关联起来 -->
 <aop:config>
  <aop:pointcut expression="execution(* com.atguigu.spring.tx.xml.service.*.*(..))" 
   id="txPointCut"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/> 
 </aop:config>

 事务的隔离级别

 

当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时, 可能会出现许多意外的问题

并发事务所导致的问题可以分为下面三种类型:

–脏读: 对于两个事物 T1, T2, T1  读取了已经被 T2 更新但 还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.

–不可重复读:对于两个事物 T1, T2, T1  读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.

–幻读:对于两个事物 T1, T2, T1  从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

 

从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题. 然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行.

在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行.

事务的隔离级别可以通过隔离事务属性指定

技术分享

本文出自 “学习总结” 博客,请务必保留此出处http://s5650326.blog.51cto.com/10667626/1718126

Spring的事务管理

标签:spring 事务传播性

原文地址:http://s5650326.blog.51cto.com/10667626/1718126

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!