使用TransactionTemplate 编程式控制事务
使用 TransactionTemplate 绝对会增加你的代码与Spring的事务框架和API间的耦合。
到底编程式事务管理是不是适合你的项目需要由你自己来决定。
应用的代码必须在一个事务性的上下文中执行,这样就会像这样一样显式的使用TransactionTemplate。你作为一个应用程序员,
会写一个 TransactionCallback 的实现, (通常会用匿名类来实现
)这样的实现会包含所以你需要在该事务上下文中执行的代码。
然后你会把一个你自己实现TransactionCallback的实例传递给TransactionTemplate暴露的execute(..)
方法。
- public
class SimpleService implementsService { -
-
//single TransactionTemplate shared amongst all methods in this instance -
privatefinal TransactionTemplate transactionTemplate; -
-
//use constructor-injection to supply the PlatformTransactionManag er -
publicSimpleService(PlatformTransactionManag er transactionManager) { -
"TheAssert.notNull(transactionManager, 'transactionManager' );argument must not be null." -
this.transactionTemplate= newTransactionTemplate(transactionManager); -
} -
-
publicObject someServiceMethod() { -
returntransactionTemplate.execute( newTransactionCallback() { -
-
//the code in this method executes in a transactional context -
publicObject doInTransaction(TransactionStatus status) { -
updateOperation1(); -
returnresultOfUpdateOperation2 (); -
} -
}); -
} - }
TransactionCallbackWitho 的匿名类,如下:
transactionTemplate.execute(new TransactionCallbackWithoutResult () { protected void doInTransactionWithoutResult(TransactionStatus status) { updateOperation1(); updateOperation2(); } });
回调方法内的代码可以通过调用 TransactionStatus 对象的 setRollbackOnly() 方法来回滚事务。
TransactionTemplate 中或者通过配置或者编程式地实现。
TransactionTemplate 实例默认继承了默认事务设置
。 下面有个编程式的为一个特定的TransactionTemplate
定制事务设置的例子。
- public
class SimpleService implementsService { -
-
privatefinal TransactionTemplate transactionTemplate; -
-
publicSimpleService(PlatformTransactionManag er transactionManager) { -
"TheAssert.notNull(transactionManager, 'transactionManager' );argument must not be null." -
this.transactionTemplate= newTransactionTemplate(transactionManager); -
-
//the transaction settings can be set here explicitly if so desired -
this.transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_UNCOMMITTED); -
this.transactionTemplate.setTimeout(30);// 30 seconds -
//and so forth... -
} - }
TransactionTemplate 的事务属性。 sharedTransactionTemplat 可以被注入到所有需要的服务中去。
- "sharedTransactionTemplat
e" -
class="org.springframework.transaction.support.TransactionTemplate"> -
"isolationLevelName"value= "ISOLATION_READ_UNCOMMITTED"/> -
"timeout"value= "30"/> - "
TransactionTemplate
类的实例是线程安全的,任何状态都不会被保存。 TransactionTemplate 实例 的确会 维护配置状态,所以当一些类选择共享一个单独的 TransactionTemplate 实例时,
如果一个类需要使用不同配置的TransactionTemplate
(比如,不同的隔离等级), 那就需要创建和使用两个不同的TransactionTemplate 。

浙公网安备 33010602011771号