手工调用jdbc的connection事务Ҏ(gu)和用JTA接口都属于编E式开发,在EJB中叫BMT(Bean理事务)?br /> JTA最重要的接口就是UserTransaction和它的六个方?beginQcommitQrollbackQgetStatusQsetRollbackonlyQsetTransactionTimeout?br /> E序需要UserTransaction时可以从JNDI领取Q不qJNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入?/p>
前面都是铺垫Q这个才是主打的事务模型Q如EJB的CMT(容器理事务)和Sprin?/p>
其中EJB2.0QSpring1.0在部|描q符和applicationContext.xml中定义,而EJB3.0和Spring2.0则采用annotation?/p>
q里JavaEE与Spring的定义基本相同:
可见QRequired是默认的讄QSupports是只L法的最佳选择?/p>
U别低安全效率也低。隔ȝ别需要相兌源支持,如重复读在Oracle里会降为ReadCommited。Spring里默认的DefaultU别完全看数据源的脸色行事?/p>
EJB里,想rollback只能sessionContext.setRollbackOnly()Q或者抛出EJBException?EJB3q可以annotation讄某些自定义Exception可以触发rollback)
在Spring里,同样只会rollback unchecked exception(RuntimeExcption及子c?Q而checked exception(Exception及子c?是不会rollback的,除非你特别声明?/p>
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})
因此所有在service层方法中用throws定义的ExceptionQ都必须在事务定义中q行rollback讑֮?请勿善忘)
所有在service层方法中c被atch处理了的异常Q又希望容器辅助rollback的话Q必重抛一个预定义的RuntimeException的子cR?请勿回望)
Spring不希望编E式事务理?br /> Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJOQ依赖于JTA全局事务对单数据源场景造成了浪费,而且rollback机制比较ȝQ必MؓEJBException或手工setRollbackOnly())?br /> 因此Spring通过AOP实现了对POJO的整套宣告式事务体系Q对jdbc,hibernate,jpa,jms{local数据源和JTA实现了统一的事务管理机Ӟ而且支持本地资源与JTA在配|文件的切换,而且改进了rollback机制?/p>
1Q一个本C务管理器Q?/p>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean>
2QSpring׃把请求都转发到应用服务器的JTA对象上(注意此时数据源也需要改为用JNDI从应用服务器获取)?/p>
<bean id="myTxManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
3Q应用服务器专有的类型的JTA事务理器:
<bean id="myTxManager" class="org.springframework.transaction.jta.WebLogicJtaTransactionManager"/>