gpt4 book ai didi

java - 为什么我需要在 Hibernate 中进行事务以进行只读操作?

转载 作者:IT老高 更新时间:2023-10-28 11:34:42 27 4
gpt4 key购买 nike

为什么我需要 Hibernate 中的 Transaction 来进行只读操作?

以下事务是否在数据库中加了锁?

从数据库中获取的示例代码:

Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction?
//readonly operation here

tx.commit() // why tx.commit? I don't want to write anything

我可以使用 session.close() 代替 tx.commit() 吗?

最佳答案

读取事务可能看起来确实很奇怪,在这种情况下,人们通常不会标记事务的方法。但是 JDBC 无论如何都会创建事务,如果没有明确设置不同的选项,它只会在 autocommit=true 中工作。但是将事务标记为只读是有实际原因的:

对数据库的影响

  1. 只读标志可以让 DBMS 优化此类事务或并行运行的事务。
  2. 拥有跨越多个 SELECT 语句的事务可确保从可重复读取或快照开始的级别的适当隔离(例如,参见 PostgreSQL's Repeatable Read)。否则,如果另一个事务并行提交,则 2 个 SELECT 语句可能会看到不一致的画面。这与使用已提交读取无关。

对 ORM 的影响

  1. 如果您没有明确地开始/结束事务,ORM 可能会导致不可预知的结果。例如。 Hibernate 将在第一条语句之前打开事务,但不会完成它。因此,连接将返回到连接池,并带有未完成的事务。那会发生什么? JDBC 保持沉默,因此这是特定于实现的:MySQL、PostgreSQL 驱动程序回滚此类事务,Oracle 提交它。请注意,这也可以在连接池级别进行配置,例如C3P0 为您提供了这样一个选项,默认回滚。
  2. Spring 在只读事务的情况下设置 FlushMode=MANUAL,这会导致其他优化,例如不需要脏检查。根据您加载的对象数量,这可能会带来巨大的性能提升。

对架构和简洁代码的影响

无法保证您的方法不会写入数据库。如果您将方法标记为 @Transactional(readonly=true),您将指定是否实际上可以在此事务的范围内写入 DB。如果您的架构很繁琐,并且某些团队成员可能会选择将修改查询放在预期之外的地方,则此标志会将您指向有问题的地方。

关于java - 为什么我需要在 Hibernate 中进行事务以进行只读操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13539213/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com