Spring事务配置、隔离设置的经验总结

关于Spring的事务配置,绝对是一个老话题了;关注最多的也就是Transactional里的Propagation,Isolation;相关论述各种论坛都重复重复再重复,不累赘了,不过推荐大家可以查看spring源码:

org.springframework.transaction.annotation.Transactional;源码内对这两个属性的枚举进行了说明(当然是英文的);值得注意的是,一个完善、可靠、健壮的系统,事实上对timeout,rollbackFor,noRollbackFor属性也是根据实际场景各有不同的;实际开发中,过多的人根本不关注只会使用默认值了,甚至对于Propagation和Isolation也是;当然确实大部分业务可能不用关心这些,全默认既ok;

      <tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="create*">
<tx:method name="save*">
<tx:method name="delete*">
<tx:method name="*" read-only="true">
<tx:method name="*" rollback-for="Exception">
</tx:attributes>
</tx:advice>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory">
</bean>

<aop:config>
<aop:advisor pointcut="execution(* *..service.*Manager.*(..))" advice-ref="txAdvice">
</aop:config>
如上配置是一般应用对全局的AOP事务配置;实际经验告诉我们实战中通常都是AOP事务配合注解事务的;

很容易理解的就像是request与session的关系一样,注解会优先于AOP事务配置;完美的解决项目中的点面问题(整个面的AOP配置,局部点用注解)

@Transactional(propagation=Propagation.MANDATORY,readOnly=true,timeout=600000)

值得注意的是timeout的默认值是-1,既没有超时,在高并发高TPS的业务请求中你会发现根据实际情况设置下timeout会让你的系统更可靠,不至于高压力至崩溃等情况,特别是这个请求可能较耗时时;根据对请求的估时(调用外部接口时间估时)设置timeout,有效降低系统压力风险,用户体验也不会太差;

猜你喜欢

转载自jeo5213.iteye.com/blog/2202348