谈谈Spring事务隔离级别和传播行为

  • Post author:
  • Post category:其他


事务隔离级别 (先从数据库的隔离级别开始说起吧 )
事务特性(4种):

原子性 (atomicity):强调事务的不可分割.

一致性 (consistency):事务的执行的前后数据的完整性保持一致.

隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰

持久性(durability) :事务一旦结束,数据就持久到数据库

脏读 、幻读、不可重复读

脏读:事务A读到了事务B未提交的数据,如果事务B出现异常回滚,就会导致事务A读到的数据是脏数据

不可重复读: 如果A事务多次读取同一个数据,事务B在事务A多次读去的过程中,更新了事务A读取的数据,就会导致事务A读取一个数据前后不一致问题

幻读: 幻读多出现在多数据进行进行修改和统计,如果事务A在进行多数据统计,突然事务B插入一个数据,当事务A做到最后,突然发现多出来一个数据,感觉像幻觉一样。

总结 :不可重复读和幻读的区别 :不可重复读侧重于单个数据的修改,而幻读侧重于数据的删除和新增。不可重复读可以通过锁行解决。但是幻读需要通过锁表来解决。

事务隔离级别(Mysql的默认隔离级别位repeatable-read   Oralce默认隔离级别 read-committed)
Spring框架的隔离级别

DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生

已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生

可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.

串行化的 (serializable) :避免以上所有读问题.

Spring的事务传播级别(事务的传播级别是一个事务调用另一个事务的规范,在spring中就是service层对象相互调用的规范)
Required      如果没有被事务包裹,创建事务;  如果被事务包裹,融入外部事务    (适合增删改)

supports      如果被事务包裹,不创建事务  ;如果被事务包裹 ,融入外部事务     (适合查询)

requires_new  如果被包裹 ,挂起外部事务,创建自己的事务  ; 如果没有事务包裹,开启事务    

no_supported    外面有没有事务,都不需要事务   什么都不要

never       如果没有被事务包裹,不开启新事务  ;如果被事务包裹,抛出异常

mandatory    如果没有被事务包裹 ,就抛出异常 ;如果被事务包裹 就融合外部事务

nested    如果被事务包裹,就融入事务  ;如果没有,创建新事务


基于XML声明式事务的配置

<!– 事务控制器 –>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>


<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:pointcut id="pointPut" expression="execution(* com.xc.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointPut"/>
</aop:config>
<tx:method>属性值
isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚



版权声明:本文为attentiony原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。