Spring学习一:事务参数

一.事务参数

     在spring里面,声明式事务是用事务参数来定义的。一个事务参数就是事务策略应该如何应用到某个方法的一段描述。一个事务参数由五个方面组成。

  1. 传播行为。
  2. 隔离级别。
  3. 只读。
  4. 事务超时。
  5. 回滚规则。

二.传播行为

     传播行为定义了关于客户端和被调用方法的事务边界。Spring定义了七种传播行为。只有PROPAGATION_REQUIRED,PROPAGATION_REQUIRED_NEW,PROPAGATION_NESTED才有可能主动开启一个新事务。

  1. PROPAGATION_MANDATORY:表示该方法必须运行在一个事务中。如果当前没有事务发生,将抛出一个异常。
  2. PROPAGATION_NEVER:表示该方法不需要运行在事务中。如果当前有事务在运行,将抛出一个异常。
  3. PROPAGATION_NOT_SUPPORTED:表示该方法不需要运行在事务中。如果当前有事务在运行,该事务会在此方法运行期间挂起。
  4. PROPAGATION_SUPPORTED:表示该方法不需要运行在事务中。但如果有一个事务在运行,该方法也可以在这个事务里运行。
  5. PROPAGATION_REQUIRED:表示该方法必须运行在事务中。如果当前有事务在运行,则该方法运行在此事务中,否则开启一个新的事务。
  6. PROPAGATION_REQUIRED_NEW:表示该方法必须运行在自己的事务中。如果当前有事务在运行,此事务挂起,开启一个新的事务。否则开启一个新的事务。
  7. PROPAGATION_NESTED:它与PROPAGATION_REQUIRED_NEW的区别是:PROPAGATION_REQUIRED_NEW完全是一个新的事务,单独commit和rollback,不依赖外部事务。而PROPAGATION_NESTED则是外部事务的子事务(称为嵌套事务),当外部事务commit时,嵌套事务才commit,当外部事务rollback时,嵌套事务才rollback。

三.隔离级别

   建议先阅读mysql事务隔离级别。隔离级别定义了一个事务可能受其它事务影响的程度。Spring提供了五种事务隔离级别。

  1. ISOLATION_DEFAULT:使用后端数据库默认隔离级别。
  2. ISOLATION_READ_UNCOMMITED:对应Read uncommited(读取未提交的内容)。
  3. ISOLATION_READ_COMMITED:对应Read commited(读取提交内容)。
  4. ISOLATION_REPEATABLE_READ:对应Repeatable read(可重复读)。
  5. ISOLATION_SERIALIZABLE:对应Serializable(可串行化)。

四.只读

     如果一个事务只对后端数据库执行读操作,那么该数据库可以利用事务的只读特性,采取优化措施。《Spring in action》

写道
由于只读的优化措施是在一个事务启动时由后端数据库实施的,因此,只有对于那些具有可能启动一个新事务的传播行为(PROPAGATION_REQUIRED,PROPAGATION_REQUIREDS_NEW,PROPAGATION_NESTED)的方法来说,将事务声明为只读才有意义。

     我就有点不了解了,<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>这样配置的readOnly岂不是没有意义?

五.超时

     假定你的事务运行时间特别长,而事务可能涉及到数据库锁定,长时间的运行事务会不必要的占据数据库资源。你可以声明一个事务,在特定的秒数后回滚,而不必等它自己结束。

六.回滚规则

     默认设置下,事务只在运行异常是回滚,受检异常不回滚。

相关推荐