gpt4 book ai didi

hibernate - 脏读在 hibernate 中如何工作

转载 作者:行者123 更新时间:2023-12-02 22:41:04 26 4
gpt4 key购买 nike

根据 Manning 的《Java Persistence with Hibernate》:

dirty read occurs if a one transaction reads changes made by another transaction that has not yet been committed. This is dangerous, because the changes made by the other transaction may later be rolled back, and invalid data may be written by the first transaction.

如果从数据库中检索记录,则会在持久状态下创建相应的对象,并且无论进行什么更改,都会首先写入持久对象,从而使其变脏。

现在我的问题是,如果其他事务正在读取同一条记录,那么它是否会从持久状态(即第一级缓存)(目前是脏的)读取该记录,还是会从数据库中检索该记录。

最佳答案

一级缓存在事务之间共享。除了扩展持久性上下文的情况之外,最常见的模式是每个事务都与单个 session /持久性上下文关联,并且拥有自己的一级缓存,仅针对该事务进行跟踪。

实际上“脏读”是数据库事务的属性,而不是一般 Hibernate 的属性。当一个事务读取另一事务所做的尚未提交的更改时,称为脏读。使用这种类型的事务是危险且不寻常的,因为读取的数据可能会回滚。

无论进行什么更改,都会首先写入持久对象,从而使其变脏。

您在上一行中所说的是对对象进行了更改(但更改尚未发送到数据库,因为像 Hibernate 这样的 ORM 会延迟刷新 sql 直到事务结束)。因此,更改后的对象现在是脏的,但对于事务却不能说同样的情况,因为没有将插入/更新/删除发送到数据库。谈论 Hibernate - 从应用程序角度来看它被认为是“脏”的原因是该对象hibernate读取的数据的表示可以通过使用setter来改变,因此对象或数据变得“脏”,需要在事务结束时刷新到数据库,否则应用程序实际上可能决定不提交。 Hibernate 的主要工作是跟踪这种变化的(“脏”)状态,并在事务结束时生成适当的插入/更新/删除。因此,这种脏性是最初读取的状态与更改后的状态(如果在同一事务中存在的话)之间的差异。

关于hibernate - 脏读在 hibernate 中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27020265/

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