题目:hibernate事务提交sql语句的顺序
分析:
总的说应该是按insert、update、delete的顺序。
具体的顺序查了下应该是:
涉及的SQL语句会按照下面的顺序发出执行:
所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序
所有对实体进行更新的语句
所有进行集合删除的语句
所有对集合元素进行删除,更新或者插入的语句
所有进行集合插入的语句
所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序
为什么会出现这种情况呢,原因是hibernate不会把sql语句直接提交给数据库,而是先放在hibernate的缓存中等事务commit的时候一起提交,这样就导致sql语句执行的顺序与程序不一致。
解决办法:
用session.flush();把sql语句刷入数据库。
比如想要执行delete语句的时候就在createQuery后面执行下session.flush();
而且在大批量数据处理的时候,可能需要分批刷出数据,然后清空缓存,以减少内存占用量。
我用的方法是在同一个session里打开两个transaction,分别处理可以分开写的业务。