一级缓存不跨事务共享。除了扩展持久性上下文的情况外,最常用的模式是每个事务都与单个会话/持久性上下文相关联,并且具有自己的第一级缓存,该缓存仅针对该事务进行跟踪。
实际上“脏读”是数据库事务的属性,而不是一般的休眠。当一个事务读取另一个尚未提交的事务所做的更改时,称为脏读。使用这种类型的事务是危险且不寻常的,因为读取的数据可能会回滚。
所做的任何更改都首先写入持久对象,因此使其变脏。
您在上一行中所说的是对对象进行了更改(但更改尚未发送到数据库,因为 ORM 之类的 Hibernate 将刷新 sql 延迟到事务结束)。因此,更改后的对象现在是脏的,但对于事务不能说同样的话,因为没有插入/更新/删除被发送到数据库。谈论休眠 - 从应用程序的角度来看,它被认为是“脏”的原因是对象hibernate 读取的数据表示可以通过使用 setter 进行更改,因此对象或数据变得“脏”,需要在事务结束时刷新到数据库,或者应用程序实际上可能决定不提交。Hibernate 的主要工作是跟踪这种变化(“脏” ) 状态并在事务结束时生成适当的插入/更新/删除。因此,这种肮脏程度是最初读取的状态和在同一事务中进行更改后的状态之间的差异(如果有的话)。