Spring TransactionTemplate 和提交

Spring TransactionTemplate and commit

我必须在处理变量之前更新数据库中变量的状态,以确保只有一个线程处理它。

为此我使用 spring's transactionTemplate 所以我的疑问是: 如果我有类似的东西:



    TransactionTemplate(new TransactionCallback()){
         execute(){
            try{
              query 1 - having select for update
              query 2 - having update
            } catch(Exception e){
              TransactionStatus.setRollBackOnly();
              throw e;
            }
         }
    }

我使用 spring 的 jdbctemplateautocommit on

发生了多少次提交? 每个查询都会提交吗? 这是实现同步的好方法吗?

当使用 TransactionTemplate 时,JDBC 连接切换到手动提交,模板管理事务生命周期,因此您将有一个 单次提交 回调中的所有操作。 Select for update 获取被访问行的独占写锁,事务结束时释放这些锁。

即使程序化方法可行,我还是建议采用声明式方法以最终获得更清晰的代码和灵活的配置。您可以使用 @Transactional(查看 REPEATABLE_READ 隔离级别):

@Transactional(isolation=Isolation.REPEATABLE_READ)
public void transactionalMethod() {
  query 1 - having select for update
  query 2 - having update
}

在我们认为大多数情况下只有 1 个线程将更新特定行的情况下,我喜欢乐观锁定的概念。如果有超过 1 个线程用于更新,则存在异常处理程序流程。我会建议不要去独占锁定,除非你认为这将是最频繁的多个线程尝试更新状态。要了解乐观锁定,请查看 post