当前位置:文档之家› spring事务

spring事务

1.6 Spring事务:
1. 编程式事务管理——编程式的事务管理可以清楚滴控制事务的边界,也就是让您自行实现事务开始时间、撤消操作的时机、结束时间等,可以实现细粒度的事务控制。

2. 声明式事务管理——然而多数的情况下,事务并不需要细粒度的控制,而是采用声明式的事务管理,好处是Spring事务管理的相关API可以不用介入程序之中,从对象的角度来看,它并不知道自己正被纳入事务管理之中,在不需要事务管理的时候,只要在设置文件上修改一下设置,即可移去事务管理服务。

Spring声明式的事务管理依赖它的AOP框架来完成。

使用声明式事务管理的好处是,事务管理不能侵入您所开发的组件,具体来说,DAO对象不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策略的话,也只需要在定义文件中重新配置。

事务的属性介绍:
Spring使用AOP来完成声明式的事务管理,因而声明式事务是以方法为边界的,Spring的事务属性自然就在于描述事务应用至方法上的策略,在Spring 中事务属性分作以下的几个参数:传播行为(Propagation behavior)、隔离层级(Isolation Level)、只读提示(Read-only hints)、事务超时期间(The transaction timeout period)
传播行为(Propagation behavior):传播行为定义了事务应用于方法的边界(Boundaries),它告知何时该开始一个新的事务,或何时事务被暂停,或方法是否要在事务中进行。

如,若传播行为设置为PROPAGATION_REQUIRED,则事务的边界在开始第一个事务的方法呼叫及结束时,如果先前没有事务被开始,则事务边界即为目前方法的执行前后。

又如果传播行为被声明为PROPAGATION_REQUIRES_NEW,则事务的边界即为该方法执行的前后。

隔离层级(Isolation Level):在一个应用程序中,可能有多个事务同时在进行,这些事务应当彼此之间另一个事务的存在,好比现在整个应用程序就只有一个事务存在,由于事务彼此之间独立,若读取的是同一个数据的话,就容易发生问题。

如:
脏读:(Dirty Read)脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另一个事务也访问了这个数据,然后使用了这个数据,由于这个数据是还没有提交的数据,(有可能回滚)那么另外这个事务读到的数据就是脏数据,依据脏数据所做的操作可能是不正确的。

不可重复读:(Non-repeatable read)指在一个事物中,多次读取同一个数据。

当这个事务还没结束时,另外一个事务也访问该同一数据。

那么,在第一个事务中
的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。

这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

幻读:(Phantom read):如当第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。

同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。

那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就像发生了幻觉一样。

为了避免以上问题的方法之一,需要在某个事务进行过程中锁定正在更新或查询的数据字段,直到目前的事务完成,然而完全锁定字段时,若另一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止,因而会造成应用程序在查询或更新数据时效率上的问题(hibernate悲观锁机制,oracle 中的for update),而事实上根据需求的不同,并不用在事务进行时完全地锁定数据,隔离层级可以让您根据实际的需求,对数据的锁定进行设置。

如:ISOLATION_DEFAULT——使用底层数据库预设的隔离层级
ISOLATION_READ_COMMITTED——允许事务读取其他并行的事务已经送出的数据字段,可以防止Dirty Read问题。

只读提示(Read-only hints):只读
事务超时期间(The transaction timeout period):
对于<tx:method>中的属性设置,若不设,则”propagation”默认为”REQUIRE”,”isolation”默认为“DEFAULT”、“timeout”默认属性为“-1”,“read-only”默认为“false”。

基于XML Schmea方式配置声明式事务:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* com.ying.sys.*.service.impl.*Impl.*(..))"
id="myPointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut" /> </aop:config>。

相关主题