spring中关于“transactionAttributes”的相关设置
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true"> <property name="transactionManager"> <ref bean="transactionManager" /> </property> <property name="transactionAttributes"> <props> <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> </props> </property> </bean>
PROPAGATION_REQUIRED–支持当前事务,假如当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,假如当前没有事务,就以非事务方法执行。
PROPAGATION_MANDATORY–支持当前事务,假如当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,假如当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方法执行操纵,假如当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方法执行,假如当前存在事务,则抛出异常。
PROPAGATION_NESTED–假如当前存在事务,则在嵌套事务内执行。假如当前没有事务,则举办与PROPAGATION_REQUIRED雷同的操纵。提高SQL语句查询速度的要领
当前所有的事务都利用“PROPAGATION_REQUIRED”属性值,而且节制事务的操纵权限为只读,以担保查询时不会更新数据。
按照上述 界说 “PROPAGATION_REQUIRED”属性会造成为所有的操纵都建设事务,从而会呈现JPA的日志中查询时也会举办更新操纵的现象,也就造成了效 率的低下。
将所有查询的操纵改成事务范例为“PROPAGATION_NEVER”(不利用事务),则查询效率当即晋升,
可是此时担忧一个问题:好比在一 个saveXXX()的要领中,假如要领内部利用更新、查询、再更新的操纵流程,会不会造成挪用查询时,由于上述设置造成的抛出异常。
别的
-Exception暗示有Exception抛出时,事务回滚. -代表回滚 +就代表提交
readonly 就是read only, 配置操纵权限为只读,一般用于查询的要领,优化浸染.
From:csdn博客 冯立彬