Mysql @交易不';不执行提交

Mysql @交易不';不执行提交,mysql,spring,jpa,transactions,Mysql,Spring,Jpa,Transactions,请参阅下面的代码片段 @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 c

请参阅下面的代码片段

@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
    }
}
@Transactional
public void savemembers服务(列表1、列表2)
{
saveMembersDAO(list1);//不执行提交。为什么?
saveMembersDAO(list2);//不执行提交。为什么?
}//仅在此处执行提交!
@持久上下文
私人实体管理者;
@交易的
公共无效保存成员DAO(列出成员)
抛出冬眠异常
{
Iterator it=members.Iterator();
while(it.hasNext())
{
成员wsBean=it.next();
em.persist(wsBean);//方法退出后将进行总体提交
}
}
我使用MySQL作为数据库。执行上述方法后,我会查看MySql日志。但在saveMembersService方法执行后,我只能看到单个提交。我希望看到每个事务方法调用有两个提交。我错在哪里

更新1:对不起,我忘记将@Transactional添加到我的服务方法中。现在修好了


更新2:我已经检查了传播。需要为DAO添加新的属性-结果相同(使用@Transactional at service方法和不使用@Transactional at service方法)

当使用@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);
            }
        }
    });
}
@Autowired
私有平台transactionManager transactionManager;
公共无效保存成员DAO(列出成员)
抛出冬眠异常
{
TransactionDefinition txDef=新的DefaultTransactionDefinition(TransactionDefinition.PROPAGATION\u REQUIRES\u new);
TransactionTemplate txTemplate=新的TransactionTemplate(transactionManager,trDef)
execute(newtransactioncallbackwithoutresult()){
@凌驾
受保护的void doInTransactionWithoutResult(事务状态){
Iterator it=members.Iterator();
while(it.hasNext())
{
成员wsBean=it.next();
em.persist(wsBean);
}
}
});
}

如果您使用的是AspectJ,并且希望有2次提交。您必须在saveMembersDAO上使用@Transactional(propagation=propagation.REQUIRES_NEW)实际上我已经检查了propagation.REQUIRES_DAO的新属性-结果相同(使用@Transactional at service方法和不使用@Transactional at service方法)您仍然只有一个提交吗?实际上我已经尝试使用TransactionTemplate了-结果相同:(我仍然只有一个委员会作为您的TransactionDefinition PROPAGATION\u REQUIRES\u NEW?oops,我在XML配置中有我的txTemplate,应该直接添加PROPAGATION\u REQUIRES\u NEW。谢谢您的回答!