Spring TransactionTemplate和commit

时间:2015-01-23 18:04:23

标签: java spring

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

为此我使用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

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

2 个答案:

答案 0 :(得分:2)

使用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 :(得分:2)

我喜欢乐观锁定的概念,在这种情况下,我们认为大多数时候只有1个线程会更新该特定行。如果有多个线程正在进行更新,则会出现异常处理程序流。我建议不要进行独占锁定,除非您认为最常见的是多线程尝试更新状态。要了解乐观锁定,请浏览post