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