我已经在网上搜索过,但到目前为止还没有答案,至少没有明确的答案。
假设您处于以下情况
@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的原因)提交事务后,所有更改将在对其他事务可见的数据库表上有效执行。
这是正常情况。但是,可以定义已执行的更改对其他事务直接可见的事务。这有其弊端。