我是靠谱客的博主 过时发箍,最近开发中收集的这篇文章主要介绍Hibernate 事务提交sql语句的顺序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近做的项目有一个很麻烦的业务,一个操作里包含了insert,update,delete,select动作。

一开始起在一个hibernate事务里,发现在入库的时候有的时候数据对不上,后来查了下资料才知道hibernate事务提交sql语句的顺序并不是按照程序里写的顺序提交的。

总的说应该是按insert、update、delete的顺序。

具体的顺序查了下应该是:

涉及的SQL语句会按照下面的顺序发出执行:
所有对实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序
所有对实体进行更新的语句
所有进行集合删除的语句
所有对集合元素进行删除,更新或者插入的语句
所有进行集合插入的语句
所有对实体进行删除的语句,其顺序按照对象执行Session.delete()的时间顺序

为什么会出现这种情况呢,原因是hibernate不会把sql语句直接提交给数据库,而是先放在hibernate的缓存中等事务commit的时候一起提交,这样就导致sql语句执行的顺序与程序不一致。

 

解决办法:

用session.flush();把sql语句刷入数据库。

比如想要执行delete语句的时候就在createQuery后面执行下session.flush();

而且在大批量数据处理的时候,可能需要分批刷出数据,然后清空缓存,以减少内存占用量。

 

我用的方法是在同一个session里打开两个transaction,分别处理可以分开写的业务。

不知这样是否会出现问题,先记录下,如果执行的时候出现问题再来更正。

也请看到的大虾们指点。

 

最后

以上就是过时发箍为你收集整理的Hibernate 事务提交sql语句的顺序的全部内容,希望文章能够帮你解决Hibernate 事务提交sql语句的顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(115)

评论列表共有 0 条评论

立即
投稿
返回
顶部