理解Hibernate事务

理解Hibernate事务,hibernate,transactions,Hibernate,Transactions,我知道,如果出现任何错误(如代码异常或数据库关闭),事务有助于回滚更新操作。我不明白的是: 在: 13.2。数据库事务划分 数据库或系统事务边界始终是必需的。不 与数据库的通信可以在数据库外部进行 事务(这似乎让许多习惯于 自动提交模式)。始终使用清晰的事务边界,即使是在 只读操作 这一条说明事务应该在所有情况下都使用,即使对于只读操作也是如此 为什么这是必须的?我不应该只在我要更新数据库时才这样做吗 如果它是必须的,为什么在获得会话时它不会自动启动 关于以下引用的段落(关于) 事务(org

我知道,如果出现任何错误(如代码异常或数据库关闭),事务有助于回滚更新操作。我不明白的是:

在:

13.2。数据库事务划分

数据库或系统事务边界始终是必需的。不 与数据库的通信可以在数据库外部进行 事务(这似乎让许多习惯于 自动提交模式)。始终使用清晰的事务边界,即使是在 只读操作

这一条说明事务应该在所有情况下都使用,即使对于只读操作也是如此

  • 为什么这是必须的?我不应该只在我要更新数据库时才这样做吗
  • 如果它是必须的,为什么在获得会话时它不会自动启动
关于以下引用的段落(关于)

事务(org.hibernate.Transaction)

(可选)应用程序用于指定 原子工作单位。它从底层JDBC、JTA或JDBC抽象应用程序 CORBA事务。一个org.hibernate.Session可能跨越多个 在某些情况下,可以使用org.hibernate.Transactions。然而,交易 使用底层API或 org.hibernate.Transaction从来都不是可选的

第一个单词
(可选)
表示什么意思

这句话也意味着什么

但是,使用底层API或org.hibernate.transaction进行事务划分从来都不是可选的。


此外,我从中了解到,每当我打开Hibernate会话时,无论是更新还是加载对象,我都必须启动事务。

加载操作不需要启动事务。只有当您的操作可以执行更新,并且您需要提交/回滚语义以防该范围内的其他操作失败时,才需要它。因此,hibernate事务只是一个作用域,在需要时(例如第一次获得连接时)将使用数据库的底层事务。如果它在事务中,那么该连接将在事务作用域的生命周期中使用,而不是在每个sql操作中返回到池中,这在没有hibernate事务的情况下会发生

谢谢你的回答。但实际上,文档强调使用事务,即使是只读操作。我进一步澄清了我的问题。这在某种程度上是误导性的。只有当多个操作必须是原子操作且语义必须全部更改或无更改时,才需要声明显式事务。但是,在某些情况下,您可以诱导读取锁定,并且您可能希望它们在多次读取时保持不变。我同意你的看法,这个文档有点误导人。根据本文,只有在启用自动提交的情况下,只读操作才不需要事务