hibernate中的脏读是如何工作的

时间:2014-11-19 15:12:30

标签: hibernate dirtyread

根据Manning的Java Persistence with Hibernate:

  如果一个事务读取另一个事务所做的更改,则会发生脏读   尚未提交的交易。这很危险   因为其他交易所做的更改可能会在以后滚动   返回,第一笔交易可能会写入无效数据。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

无论做出什么更改,都会首先写在持久对象上,从而使其变脏。

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