did*_*xga 5 java spring transactions
Spring支持程序化事务,使我们能够对TX管理进行细致的控制.根据Spring Documentation,可以通过以下方式使用程序化TX管理:
1.利用Spring的TransactionTemplate:
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
try {
updateOperation1();
updateOperation2();
} catch (SomeBusinessExeption ex) {
status.setRollbackOnly();
}
} });
Run Code Online (Sandbox Code Playgroud)
2.直接利用PlatformTransactionManager(将一个PlatformTransactionManager实现注入DAO):
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
//txManager is a reference to PlatformTransactionManager
TransactionStatus status = txManager.getTransaction(def);
try {
updateOperation1();
updateOperation2();
}
catch (MyException ex) {
txManager.rollback(status);
throw ex;
}
txManager.commit(status);
Run Code Online (Sandbox Code Playgroud)
为简化起见,假设我们正在处理JDBC数据库操作.
我想知道updateOperation1(),updateOperation2()在第二个片段中发生的任何数据库操作,无论是用JDBCTemplate或实现JDBCDaoSupport,如果没有,操作实际上不在任何事务中执行,是吗?
我的分析是,如果我们不使用JDBCTemplate或者JDBCDaoSupport,我们不可避免地会从数据源管理中创建/检索连接.我们得到的连接当然不是PlatformTransactionManager底层管理事务所使用的连接.
我挖了Spring源代码和skim相关的类,发现PlatformTransactionManager它将尝试检索包含在ConnectionHolder其中的返回的连接TransactionSynchronizationManager.我也发现JDBCTemplate并JDBCDaoSupport,尝试与类似的例程建立连接TransactionSynchronizationManager.
因为TransactionSynchronizationManager管理许多资源包括每个线程的连接(主要用于Threadlocal确保一个线程获得自己的托管资源的唯一实例)
所以我认为通过PlatformTransactionManager检索的连接和/ JDBCTemplate或是JDBCDaoSupport相同的,这可以解释spring programmatic事务确保如何updateOperation1(),updateOperation2()被事务保护.
我的分析是否正确?如果是的话,为什么Spring文档没有强调这个警告?
是的,这是正确的。
任何使用 raw 的代码Connection都应该以特殊方式获取它们DataSource,以便参与 Spring 管理的事务(12.3.8 DataSourceTransactionManager):
应用程序代码需要通过 DataSourceUtils.getConnection(DataSource) 而不是 Java EE 的标准 DataSource.getConnection 来检索 JDBC 连接。
另一种选择(如果您无法更改调用的代码getConnection())是将您的代码包装DataSource为TransactionAwareDataSourceProxy.
| 归档时间: |
|
| 查看次数: |
2456 次 |
| 最近记录: |