Spring的七种事务传播途径和隔离级别
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
?
同时也可以配置事务的隔离级别:
<property name="transactionAttributes">
??????????????? <props>
??????????????????? <prop key="insert*">
??????????????????????? PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
??????????????????? <prop key="tran*">
??????????????????????? PROPAGATION_REQUIRED, ISOLATION_SERIALIZABLE</prop>
??????????????????? <prop key="deposit*">
??????????????????????? PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED</prop>
??????????????? </props>
?</property>
?
?
ReadOnly
事务属性中的readOnly标志表示对应的事务应该被最优化为只读事务。
这是一个最优化提示。在一些情况下,一些事务策略能够起到显著的最优化效果,例如在使用Object/Relational映射工具(如:Hibernate或TopLink)时避免dirty checking(试图“刷新”)。
?
也可以把事务设置成只读事务,达到最大的事务优化:
?? <prop key="get*">
??????????????????????? PROPAGATION_SUPPORT, readOnly</prop>
Timeout
在事务属性中还有定义“timeout”值的选项,指定事务超时为几秒。在JTA中,这将被简单地传递到J2EE服务器的事务协调程序,并据此得到相应的解释。