mysql autocommit vs管理器和daos插入方法

时间:2014-10-01 08:26:20

标签: java mysql spring hibernate

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

@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
感谢所有人,这个讨论可以被认为是封闭的。

1 个答案:

答案 0 :(得分:0)

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

这是正常情况。但是,可以定义其中执行的更改对其他事务直接可见的事务。这有其不足之处。