3

根据 Manning 的 Java Persistence with Hibernate:

如果一个事务读取了另一个尚未提交的事务所做的更改,则会发生脏读。这是危险的,因为其他事务所做的更改稍后可能会回滚,并且第一个事务可能会写入无效数据。

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

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

4

1 回答 1

2

一级缓存跨事务共享。除了扩展持久性上下文的情况外,最常用的模式是每个事务都与单个会话/持久性上下文相关联,并且具有自己的第一级缓存,该缓存仅针对该事务进行跟踪。

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

所做的任何更改都首先写入持久对象,因此使其变脏。

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

于 2014-11-20T04:24:56.580 回答