我已经在网上搜索过,但到目前为止还没有答案,至少没有明确的答案。
假设您处于以下情况

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
private void usingManagerTest()
{
    List<SomeType> someList = someDao.findAll();
    for (SomeType listItem : someList )
    {
         someManager.create();
    }
}


其中someManager.create()设置实体的字段,例如someEntity,然后调用someDao.create(someEntity)。
Mysql日志显示,对于for中的每个迭代,将执行以下mysql查询:

set autocommit = 0
insert into ...
commit


现在假设您处于以下情况:

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
private void usingDaoTest()
{
    List<SomeType> someList = someDao.findAll();
    for (SomeType listItem : someList )
    {
         SomeEntity someEntity = someManager.createEntity();
         someDao.create(someEntity);
    }
}


其中createEntity方法调用Java实体上的一些设置器,并且创建由DAO执行。这导致如下所示的mysql日志:

set autocommit = 0
insert into ...
insert into ...
insert into ...
...
commit


其中插入查询数是for循环中的迭代数。

我已经阅读了Spring文档,但到目前为止,我仍不清楚为什么会发生这种情况。
任何人都可以解释这种行为?

谢谢

附言我知道标题不清楚,欢迎任何建议。

更新:看来它的工作方式与我所说的不同:使用usingDaoTest()运行产生的日志根本不显示自动提交查询(这对我没有好处)。
我仍然对理解两个脚本为何工作原理不同感兴趣,但是现在我对理解如何实现第二个日志结果也很感兴趣(在for循环中,所有操作都在autocommit = 0和commit之间执行)。

再次感谢

UPDATE2:经过其他测试后,我对@Transactional背后的逻辑有了更多的了解,因此我进行了更具体的研究,找到了解决方案here

感谢所有人,本次讨论可以被认为是封闭的。

最佳答案

在事务运行时,MySQL将为您执行操作。 (将autocommit设置为0的原因)提交事务后,所有更改将在对其他事务可见的数据库表上有效执行。

这是正常情况。但是,可以定义已执行的更改对其他事务直接可见的事务。这有其弊端。

09-10 06:36
查看更多