为什么在Hibernate中需要事务处理才能进行只读 *** 作?

为什么在Hibernate中需要事务处理才能进行只读 *** 作?,第1张

为什么在Hibernate中需要事务处理才能进行只读 *** 作?

你实际上可能有理由将事务标记为只读。

  1. 阅读交易看起来确实很奇怪,在这种情况下,人们通常不会标记交易方法。但是JDBC仍然会创建事务,只是
    autocommit=true
    如果未明确设置其他选项,它将可以正常工作。
  2. 但是,不能保证你的方法不会写入数据库。如果将method标记为
    @Transactional(readonly=true)
    ,Spring会将JDBC事务设置为只读模式,因此你将决定在该事务范围内是否实际上可以写入DB。如果你的体系结构繁琐,并且某些团队成员可能选择将修改查询放在意料之外的地方,则此标志会将你指向有问题的地方。
  3. DB也可以优化只读事务,但这当然是特定于DB的。例如,MySQL从5.6.4版本开始仅在InnoDB中添加了对此的支持。
  4. 如果你不是直接使用JDBC,而是使用ORM,则可能会出现问题。例如,Hibernate社区说在事务外工作可能会导致不可预知的行为。这是因为Hibernate将打开事务,但不会自行关闭它,因此连接将在未提交事务的情况下返回到连接池。那会发生什么呢?JDBC保持沉默,因此这是特定于实现的(MySQL回滚事务,Oracle afair提交)。这也可以在连接池级别上配置(例如C3P0为你提供了这样的选项,默认情况下为回滚)。
  5. 关于Hibernate的另一件事,在只读事务的情况下,Spring将FlushMode设置为MANUAL,这会导致其他优化,例如不需要脏检查。
  6. 你可能想要覆盖或显式设置事务隔离级别。这也会影响读取事务,因为你要读取或不希望读取未提交的更改,暴露于幻像读取等。
    综上所述-你可以双向进行,但你需要了解后果。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zaji/5109576.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-17
下一篇2022-11-17

发表评论

登录后才能评论

评论列表(0条)

    保存