我使用Spring并且有两个使用声明式事务的方法......
在某些情况下,methodA调用methodB ..我需要知道的是声明性trasaction提交会发生两次...
示例
public void methodA() throws Exception {
this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED)
final Order order = this.transactionTemplate.execute(new TransactionCallback<Order>() {
@Override
public Order doInTransaction(TransactionStatus status) {
Order order = new Order();
String name = "Customer 2 " + (new Date()).toLocaleString();
order.setCustomer(name);
entityManager.persist(order);
..........................
.......................
// call methodB
methodB();
}
public void methodB() throws Exception {
this.transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
final Address add = this.transactionTemplate.execute(new TransactionCallback<Address >() {
@Override
public Order doInTransaction(TransactionStatus status) {
Address add= new Address ();
add.setAddress("address");
entityManager.persist(add);
......................
.....................
}
通过使用PROPOGATION_REQUIRED,methodB中的事务将加入在methodA中启动的事务。
但这是否意味着交易被提交两次?
我在方法B中为事务添加了sychronizer:
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
public void afterCommit() {
System.out.println("====> AFTER SUCCESSFUL COMMIT 2 TO DB...");
}
我在方法A中为事务添加了sychronizer:
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
public void afterCommit() {
System.out.println("====> AFTER SUCCESSFUL COMMIT 1 TO DB...");
}
我得到的输出是在methodA completed ::
之后====> AFTER SUCCESSFUL COMMIT 2 TO DB...
====> AFTER SUCCESSFUL COMMIT 1 TO DB...
我想这意味着已经为trans..manager分配了两个sycnroniser,并且当提交发生一次时......两个同步器都被调用了?正确吗?
答案 0 :(得分:0)
因为您使用的是PROPAGATION_REQUIRED
,所以不会有两个不同的事务,这两种方法都将在同一个事务中运行。如果你看一下PROPAGATION_REQUIRED
的定义,就说
支持当前交易;如果不存在,则创建一个新的。
。
因此,如果methodB
成功完成,那么它将不会提交事务,但如果失败则将事务标记为rollback-only
。实际提交或回滚的责任在于创建事务的人。在您的情况下,它将在methodA