gpt4 book ai didi

mysql - @Transactional 不执行提交

转载 作者:行者123 更新时间:2023-11-29 02:02:10 24 4
gpt4 key购买 nike

请看我下面的代码片段。

@Transactional
public void saveMembersService(List<Member> list1, List<Member> list2)
{
saveMembersDAO(list1); // does not perform commit. Why?
saveMembersDAO(list2); // does not perform commit. Why?
} // does perform commit only here!

@PersistenceContext
private EntityManager em;

@Transactional
public void saveMembersDAO(List<Member> members)
throws HibernateException
{
Iterator<Member> it = members.iterator();
while (it.hasNext())
{
Member wsBean = it.next();
em.persist(wsBean); // overall commit will be made after method exit
}
}

我使用 MySQL 作为数据库。我在执行上述方法后查看 MySql 日志。但在 saveMembersService 方法执行后,我只能看到单个 提交。我希望看到每个事务方法调用都有两次 提交。我哪里错了?

更新 1: 抱歉,我忘记将 @Transactional 添加到我的服务方法中。现在修复了

更新 2: 我检查了 DAO 的 Propagation.REQUIRES_NEW 属性 - 结果是相同的(在服务方法中使用和不使用 @Transactional)

最佳答案

当使用@Transactional 时,Spring 会围绕您的类创建一个代理,内部调用的方法不会传入该代理。

您必须改为执行此操作。您可以通过在 Spring 上下文中创建 TransactionTemplate 来清理它。

@Autowired
private PlatformTransactionManager transactionManager;

public void saveMembersDAO(List<Member> members)
throws HibernateException
{
TransactionDefinition txDef = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionTemplate txTemplate = new TransactionTemplate(transactionManager, trDef)

txTemplate.execute(new TransactionCallbackWithoutResult() {

@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
Iterator<Member> it = members.iterator();
while (it.hasNext())
{
Member wsBean = it.next();
em.persist(wsBean);
}
}
});
}

如果您正在使用 AspectJ 并且您希望有 2 次提交。您必须在 saveMembersDAO 上使用 @Transactional(propagation = Propagation.REQUIRES_NEW)

关于mysql - @Transactional 不执行提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12921582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com