声明式事务的最大好处在于我们无需修改既有代码。方法实现过程中,我们压根无需为其添加事务管理支持。
xml配置
//..省略 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref local="dataSource"> </property> </bean> <bean id="accountManagerTarget" class="xx路径"> <property name="xxDao"> <ref local="xx"/> </property> <property name="xxDao"> <ref local="xx"/> </property> </bean> <bean id="accpuntManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="transactionManager"/> </property> <property name="target"> <ref local="accountManagerTarget"/> </property> <property name="transactionAttributes"> <props> <prop key="insert*"> PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED </prop> <prop key="transfer*"> PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED </prop> <prop key="deposit*"> PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED </prop> </props> </property> </bean> //..省略其他配置
我们定义了一个transactionmManager bean,实现位于DataSourceTransactionManager中。这个事务管理器需要通过dataSource bean对JDBC事务进行控制。我们的accountManager bean 实际上是accountManagerTarget的代理.代理负责对transactionmManager bean的调动,当transactionAttributes中定义的方法调用时,相应的代理通过transactionmManager 创建事务,然后调用对应的目标方法。如果目标方法抛出了一个异常,代理会驱动transaction对相应事务进行回滚。如果目标方法成功,则提交事务。