有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring编程事务管理警告?

Spring支持编程事务,这使我们能够对TX管理进行细粒度的控制。根据Spring文档,可以通过以下方式使用程序化的TX管理:
1.利用Spring的TransactionTemplate:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {

protected void doInTransactionWithoutResult(TransactionStatus status) {
    try {
        updateOperation1();
        updateOperation2();
    } catch (SomeBusinessExeption ex) {
        status.setRollbackOnly();
    }
} });

二,。直接利用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);

为了简化,假设我们正在处理JDBC数据库操作

我想知道在第二个代码片段的updateOperation1(),updateOperation2()中是否有任何数据库操作发生,或者是用JDBCTemplateJDBCDaoSupport实现的,如果不是,操作实际上不会在任何事务中执行,是吗

我的分析是,如果我们不使用JDBCTemplateJDBCDaoSupport,我们将不可避免地从数据源管理中创建/检索连接。我们得到的连接当然不是底层PlatformTransactionManager用来管理事务的连接

我挖掘了Spring源代码,发现与skim相关的类PlatformTransactionManager将尝试检索ConnectionHolder中包含的连接,而该连接反过来从TransactionSynchronizationManager中检索。我还发现JDBCTemplateJDBCDaoSupport,也试图从TransactionSynchronizationManager.获得与类似例程的连接

因为TransactionSynchronizationManager管理许多资源,包括每个线程的连接(基本上使用Threadlocal来确保一个线程获得其自己的唯一托管资源实例)

所以我认为PlatformTransactionManager和JDBCTemplateJDBCDaoSupport检索到的连接是一样的,这可以解释spring编程事务如何确保updateOperation1(),updateOperation2()受到事务的保护

我的分析正确吗?如果是,为什么Spring文档没有强调这个警告


共 (1) 个答案

  1. # 1 楼答案

    是的,没错

    任何使用原始Connection的代码都应该以特殊方式从DataSource获取它们,以便参与Spring(12.3.8 DataSourceTransactionManager)管理的事务:

    Application code is required to retrieve the JDBC connection through DataSourceUtils.getConnection(DataSource) instead of Java EE's standard DataSource.getConnection.

    另一个选项(如果无法更改调用getConnection()的代码)是用^{}包装DataSource