私有方法上的@Transactional传播机制

9
我有以下代码:
@Service
public class MyService implements IMyService {
    @Inject
    IAnotherService anotherService;
    // injects go here
    // some code
    @Transactional(isolation=Isolation.SERIALIZABLE)
    public Result myMethod() {
        // stuff done here
        return this.myPrivateMethod()
    } 

    private Result myPrivateMethod() {
         // stuff done here
         // multiple DAO SAVE of anObject
         anotherService.processSomething(anObject);
         return result; 
    }
}

@Service
public class AnotherService implements IAnotherService {
      // injections here
      // other stuff

      @Transactional(isolation=SERIALIZABLE)
      public Result processSomething(Object anObject) {
         // some code here
         // multiple dao save
         // manipulation of anObject
         dao.save(anObject);
      }
}
  1. @Transactional的行为是否会传播到私有方法myPrivateMethod中呢?
  2. 如果在processSomething()上发生RuntimeException,并且从myPrivateMethod调用了processSomething,那么myPrivateMethodmyMethod是否会回滚?
  3. 如果问题1和2的答案为否,那么我如何实现而不必创建另一个@Service呢?如何在@Transactional上下文中提取方法并调用多个私有方法?
  4. isolation=Isolation.SERIALIZABLE选项是synchronized方法的一个好替代吗?

我知道这个问题已经被解答了,但我仍然有疑问。


你目前找到的答案告诉了你什么?
  1. 是的
  2. 是的
  3. 不适用,因为 1 && 2
  4. 不是的,因为它只在事务容器内调用方法时有效。
- Dominik Sandjaja
找到了一些部分回答我的问题的参考资料,但主要话题并不是我所关注的。我真的很想确定在我的情况下@Transactional注解是否真的起作用。对于问题4:如果我强制使用Propagation.MANDATORY会怎样? - dantebarba
1个回答

10
  1. 如果被注解为@Transactional的公共方法调用了myPrivateMethod,则会传播事务。
  2. 如果第一个条件成立,是的,它将回滚。
  3. 将数据库隔离级别和类方法的同步进行比较是一种误解。它们根本不应该进行比较。如果您的方法将在多线程环境中使用,您应该同步方法(请注意,在某些情况下,具有线程安全代码可能不足够)。隔离级别SERIALIZABLE在数据库级别上使用。这是最严格的隔离级别,当你运行某个查询时,它可能会锁定很多表,直到它完成,以帮助数据不变成一些不一致的状态。您应该确定您需要这个隔离级别,因为这可能会导致性能问题。所以答案是否定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接