执行顺序问题
Hibernate在最终执行SQL语句时,是按INSERT,UPDATE,DELETE的顺序执行的,而非按照代码顺序执行。
利用对象更新数据
hibernate为了优化性能,不会把sql语句直接提交给数据库,而是先放在hibernate的缓存中等待事务commit的时候一起提交,为的是利用batch操作提高数据库操作性能。
在执行commit的时候会默认执行flush将缓存中的数据请求立即转换为数据库操作并执行。
flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交(虽然数据库没有提交真是的数据没有发生变化,但是能够从session中取出已改变的数据)。而commit方法则会首先调用flush方法,然后提交事务。
利用SQL语句更新数据
SQL语句不会放在缓存中,而是直接发送给数据库(未提交),在commit的时候才会影响数据库持久化数据。
从session中查询数据但更新保存时不影响session中的数据。如果向查询更新后的数据需要使用evict清空该对象在session中的缓存然后在进行查询。(虽然还没有commit但是查出的是更新后的数据)
多线程并发问题
利用对象操作
乐观锁悲观锁
利用SQL操作
SQL对数据进行更新的时候加上where条件判断影响行数(SQL在update的时候会给该条数据加上行级锁)