【问题标题】:Disabling auto-commit in NamedParameterJdbcTemplate.batchUpdate在 NamedParameterJdbcTemplate.batchUpdate 中禁用自动提交
【发布时间】:2013-05-30 17:52:41
【问题描述】:

我正在使用NamedParameterJdbcTemplate.batchUpdate 对我的数据库表进行批量更新,但我想禁用auto-commit 并手动执行提交。

我可以从connection 对象设置自动提交模式,但不知道如何使用NamedParameterJdbcTemplate 对象来做同样的事情。

【问题讨论】:

  • 无论如何你都不应该在自动提交模式下工作!

标签: java sql spring jdbctemplate autocommit


【解决方案1】:

我已经使用TransactionTemplate完成了我的实现

它有一个execute 方法,我在这个函数的回调中执行业务逻辑。

transTemplate.execute( new TransactionCallbackWithoutResult()
        {       
                @Override
                protected void doInTransactionWithoutResult( TransactionStatus status)
                {
                    status.setRollbackOnly();
                    //business logic
                }

        });

【讨论】:

    【解决方案2】:

    我假设您了解 Spring 中的事务管理,通过定义 @Transactional 并传递 Propagation 和 Isolation 的元数据,您可以优雅地管理事务。如果不看看Spring documentation。在大多数情况下,这就是您所需要的。

    如果您想自己获得事务管理并对其进行微调(也就是随意执行提交和回滚),您必须直接获取底层的TransactionManager。

    引用Spring docs:

    使用 PlatformTransactionManager

    您也可以直接使用org.springframework.transaction.PlatformTransactionManager 来管理您的交易。只需通过 bean 引用将您正在使用的 PlatformTransactionManager 的实现传递给您的 bean。然后,使用TransactionDefinition 和TransactionStatus 对象,您可以启动事务、回滚和提交。

    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    // explicitly setting the transaction name is something that can only be done programmatically
    def.setName("SomeTxName");
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    
    TransactionStatus status = txManager.getTransaction(def);
    try {
      // execute your business logic here
    }
    catch (MyException ex) {
      txManager.rollback(status);
      throw ex;
    }
    txManager.commit(status);
    

    【讨论】:

    • 谢谢,快速反馈一下,TransactionDefinition 是在哪里定义的?
    • 另一个问题,对于业务逻辑,我将使用 NamedParameterJdbcTemplate,它使用与创建 DataSourceTransactionManager 相同的数据源。两者是否能够相互交互,即指同一个数据库连接?
    • 全称是:org.springframework.transaction.TransactionDefinition和org.springframework.transaction.TransactionStatus。如果您使用 Maven 拉取依赖关系,那就是依赖关系坐标: org.springframeworkspring-tx3.1.2.RELEASE
    • 正是那个:DataSourceTransactionManager。您所要做的就是将它注入到您要执行这些操作的 Bean 中。 NamedParameterJdbcTemplate 下面也在使用它,如果你将它注入到你的 bean 中,你将获得它的控制权并能够使用微调的 TransactionDefinition 和 TransactionStatus。
    • 我感觉你不需要这一切。 @Transactional 如果您注释了调用 DAO 的 Service 方法,而您的 jdbcTemplate 用于您的 CRUD 操作,那么 @Transactional 应该就足够了。我建议快速阅读文档:static.springsource.org/spring/docs/3.2.x/… 和谷歌示例。
    猜你喜欢
    • 2021-09-05
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2015-02-16
    • 1970-01-01
    • 2021-04-13
    • 2016-01-22
    相关资源
    最近更新 更多