有@Transactional(propagation = Propagation.SUPPORTS)
的方法与根本没有@Transactional
注释的方法有什么区别?
@Transactional(propagation = Propagation.SUPPORTS)
public void MyMethod()
vs
public void MyMethod()
没有注释的人是否还会使用已打开的交易,否则继续进行任何交易?
答案 0 :(得分:0)
在您的链接中,它指出Propagation.SUPPORTS可能会对 同步:
支持与完全没有交易完全不同,因为它定义了同步将适用的交易范围。因此,将为整个指定范围共享相同的资源(JDBC连接,休眠会话等)
答案 1 :(得分:0)
是的,如果没有打开任何注释,将使用现有事务;但是如果没有任何注释,如果事务失败,您将不希望还原更改。
如果您的方法不依赖于父事务并且在单独的事务范围内运行,则传播还具有其他属性,也许您可以使用REQUIRES_NEW,这样您的方法可以拥有独立的事务。
答案 2 :(得分:0)
带有@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
一起使用,那么在这种情况下,发生的情况是它设置事务范围以检查是否存在任何当前事务或不。如果没有当前交易,则该方法将以非交易方式执行。
不带有@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可能会对同步产生重大影响,因为它定义了同步将应用的事务范围。