脏读在休眠中的工作方式



根据Manning的Java Persistence with Hibernate:

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

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

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

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

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

无论做出什么改变,首先都写在持久对象上,因此使它变脏。

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

相关内容

最新更新