Spring:使用@Transactional(propagation = Propagation.SUPPORTS)与不使用@Transactional的方法之间的区别

时间:2019-09-23 04:43:00

标签: spring transactions spring-transactions

@Transactional(propagation = Propagation.SUPPORTS)的方法与根本没有@Transactional注释的方法有什么区别?

@Transactional(propagation = Propagation.SUPPORTS)
public void MyMethod()

vs

public void MyMethod()

没有注释的人是否还会使用已打开的交易,否则继续进行任何交易?

4 个答案:

答案 0 :(得分:0)

在您的链接中,它指出Propagation.SUPPORTS可能会对 同步:

  

支持与完全没有交易完全不同,因为它定义了同步将适用的交易范围。因此,将为整个指定范围共享相同的资源(JDBC连接,休眠会话等)

答案 1 :(得分:0)

是的,如果没有打开任何注释,将使用现有事务;但是如果没有任何注释,如果事务失败,您将不希望还原更改。

如果您的方法不依赖于父事务并且在单独的事务范围内运行,则传播还具有其他属性,也许您可​​以使用REQUIRES_NEW,这样您的方法可以拥有独立的事务。

答案 2 :(得分:0)

  1. 带有@Transactional批注的方法:

    • @Transactional 注释方法时,该方法将在单个数据库事务中执行。

例如:

如果您有这样的代码:

@Service
public class UserDAOImpl implements UserDAO { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional   
    public void createUser(User user) { 
        em.persist(user);    
    }
}

在这种情况下,会发生什么? - JPA包含 @PersistenceContext ,可从容器中加载 EntityManager 然后, @Transactional 自行维护整个交易。您无需手动开始和结束交易。

现在,如果将此(propagation = Propagation.SUPPORTS)@Transactional一起使用,那么在这种情况下,发生的情况是它设置事务范围以检查是否存在任何当前事务或不。如果没有当前交易,则该方法将以非交易方式执行。


  1. 不带有@Transactional批注的方法:

    • 在这种情况下,您必须手动管理交易。

例如:

如果您有这样的代码:

 // add the persistence unit name  
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("demo");
 EntityManager em = emf.createEntityManager();
 em.getTransaction().begin();
 User user = new User();
 user.setName("Michael");
 user.setAge("23");
 em.persist(user);
 em.getTransaction().commit();

在这种情况下,您必须手动获取Bean。然后,您必须开始事务并结束事务。为此,还有很多工作要做。

使用@Transactional(propagation = Propagation.SUPPORTS)可以由容器管理交易,而如果没有@Transactional容器将完全不管理交易

答案 3 :(得分:0)

如果您的应用程序仅使用一个数据源,则使用Propagation.SUPPORTS或不使用@Transaction都没有区别。

但是,如果您的应用程序数据分布在许多源中,则您的事务可能也应该分布。因此,您需要同步。 因此,正如user7294900所提到的,Propagation.SUPPORTS可能会对同步产生重大影响,因为它定义了同步将应用的事务范围。