当我们提供事务管理apis时,为什么在Hibernate中默认为autocommit为false?

sar*_*man 3 java spring hibernate transactions

当我们提供事务管理apis时,我没有清楚地知道为什么autocommit在Hibernate中默认为false.我有三个问题

  1. 为什么Hibernate不推荐自动提交模式?

  2. 当我们使用autocommit = true然后使用Hibernate Transaction apis进行事务管理时会发生什么?

  3. 当使用spring声明式事务管理时,@ Transnsal(readonly = true)将如何帮助我们编写的只读代码(Hibernate代码)?

Amo*_*ogh 6

我将逐一回答从(2)开始,因为我不太了解(1)

(2):autocommit = true表示默认情况下所有查询都被提交.在这种情况下如果

  • 如果方法上有@Transactional,它会覆盖自动提交并将所有查询封装到单个事务中,从而覆盖自动提交

  • 如果存在调用其他@Transactional注释方法的@Transactional方法,则最外层注释应覆盖内部注释并创建更大的事务,因此注释也会覆盖彼此.

(3):在像Oracal/Mysql这样的数据库中,只读事务可以转换为READ_ONLY级别,它不提供脏读,不提供不可重复的读操作但不允许任何更新.这意味着刷新模式将设置为FlushMode.NEVER当前Hibernate会话,防止会话提交事务.甚至setReadOnly(true)将在JDBC连接上调用,这确保您无法调用session.flsuh()甚至手动刷新会话.

由于Spring本身不执行持久性,因此无法指定readOnly应该具有什么意义.这个属性只是对提供者的一个提示,行为依赖于,在这种情况下,Hibernate.