我有两种方法可以执行以下操作:
void withdraw(int amount) {
transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction() { ... }
}
}
void deposit(int amount) {
transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction() { ... }
}
}
现在我想定义在同一个事务中同时执行的第三种方法:
void transferTo(Account other, int amount) {
transactionTemplate.execute(new TransactionCallback() {
@Override
public Object doInTransaction() {
withdraw(amount);
other.deposit(amount);
return null;
}
}
}
事务传播设置为 REQUIRED(默认)。
用例很明显,如果独立调用,我希望withdraw() 和 deposit() 在它们自己的事务中运行。但是,如果我调用 transfer(),我希望所有语句都在同一个事务中运行。
但是,当我运行 transfer() 时,出现以下异常:
Caused by: java.lang.IllegalStateException: Already value [org.springframework.jdbc.datasource.ConnectionHolder@e4b2ed] for key [org.apache.tomcat.dbcp.dbcp.BasicDataSource@26cc37d2] bound to thread [http-bio-8084-exec-13]
at org.springframework.transaction.support.TransactionSynchronizationManager.bindResource(TransactionSynchronizationManager.java:189)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:234)