我必须在处理变量之前更新数据库的状态,以确保只有一个线程处理它。
为此我使用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 jdbctemplate
和autocommit on
。
发生了多少次提交? 每个查询都会发生提交吗? 这是实现同步的好方法吗?
答案 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