【问题标题】:how dirty read works in hibernate脏读在休眠中是如何工作的
【发布时间】:2015-01-17 04:09:19
【问题描述】:

根据 Manning 的 Java Persistence with Hibernate:

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

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

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

【问题讨论】:

    标签: hibernate dirtyread


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以你的意思是如果我们试图在同一个事务中获取相同的记录(即具有相同的id),就会发生脏读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2015-09-13
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多