我已经通过网络搜索但到目前为止没有答案,至少没有明确答案。
假设您处于以下情况
@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实体上调用某些setter,而create由DAO执行。这导致了如下的mysql日志:
set autocommit = 0
insert into ...
insert into ...
insert into ...
...
commit
其中insert查询的数量是for循环中的迭代次数。
我已经阅读了弹簧文档,但到目前为止我还不清楚为什么会发生这种情况 有谁可以解释这种行为?
由于
P.S。我知道标题不清楚,欢迎提出任何建议。
更新:它似乎与我所说的不同:运行usingDaoTest()产生的日志根本不显示自动提交查询(这对我没有好处)。
我仍然有兴趣理解为什么这两个脚本的工作方式不同,但现在我也对理解如何实现第二个日志结果感兴趣(for循环中的所有操作都在autocommit = 0和提交)。
再次感谢
UPDATE2:经过其他一些测试后,我对@Transactional背后的逻辑有了更多了解,因此我进行了更具体的研究,找到了解决方案here。
感谢所有人,这个讨论可以被认为是封闭的。
答案 0 :(得分:0)
MySQL将在您的事务运行时为您执行操作。 (自动提交设置为0的原因)提交事务后,将对其他事务可见的数据库表有效地执行所有更改。
这是正常情况。但是,可以定义其中执行的更改对其他事务直接可见的事务。这有其不足之处。