楼主说的没有错,的确是不同步的。 但这个也就是为什么需要transaction的原因阿,这个transaction要么成功提交,要么rollback,这样才能保证后续程序取得的数据与数据库中的数据同步阿。其实数据库也是这么实现的,一段数据库操作,要么commit,要么rollback,而中间的结果是不允许访问的。也就是说session1所在transaction操作过程的中间数据是不可以被session2访问的。必须要是线程安全的。

解决方案 »

  1.   

    在我的例子中是直接调用Session.flush(),按Hibernate文档的说法,在某些查询执行时也会自动调用flush,这就有潜在的不安全。除非我指定sess.setFlushMode(FlushMode.COMMIT),每次transction commit时才flush,但这样Hibernate的API就没有必要存在flush()方法。Hibernate的文档:
    flush, occurs by default at the following points 1.before some query executions 2.from org.hibernate.Transaction.commit() 3.from Session.flush()
      

  2.   

    不知道我有没有理解楼上的意思:在某些查询执行时也会自动调用flush不会造成脏数据阿,所以不会有潜在的不安全阿。
    所有会造成数据不同步的情况,例如你所提到的,都应该避免。举个例子,数据库的2阶段提交肯定要保证都提交成功,或者都失败。不可能把成功一半的数据暴露给其他用户的。