【发布时间】:2013-03-03 17:42:17
【问题描述】:
我有一个问题,如果两个不同的网络用户在同一个实体上工作,会发生什么。 例如一个共享实体有四个字段:
class HibernateSharedEntity
{
int id;
int a;
int b;
int c;
int d;
}
现在,两个用户同时打开了一笔交易。其中一个正在更新该实体,第二个用户正在阅读该实体。以下步骤将更好地解释它:
时间 1:Hibernate 实体存储在数据库中,具有值:a=b=c=d=0 和 id=1。
时间 2:用户 1 开启新交易。
时间 3:User1 读取 id=1 的 HibernateSharedEntity
时间 4:用户 1 正在修改所有字段:例如a=2,b=3,c=4,d=5。
时间 5:User1 正在提交事务。
时间 6:Hibernate 正在更新 a=2
时间 7:Hibernate 正在更新 b=3
时间 8:现在 User2 打开一个新事务并读取这个共享实体。问题:
他找回了什么?他是否获取了一个半更新的实体,例如:
a=2 , b=3, c=0, d=0 ?
时间 9:Hibernate 正在更新 c=4
时间 10:Hibernate 正在更新 d=5
我想避免半更新的实例。这是我的应用程序中的一个关键点。 如果第二个用户想要检索这个共享实体,我想要第二个 用户只能在两种状态下读取此共享实体,a=b=c=d=0 状态(提交前)或 a=2,b=3,c=4,d=5 状态(提交后)。我知道休眠可以进行一次插入来更新所有这些值,但在我的应用程序中它似乎更复杂,因为这个共享实体与其他共享实体有关系,也可以由 User1 更新。所以从现在开始,hibernate 不能进行一次插入来更新这两个共享实体。因此,当用户 1 在一个事务中更新更多共享实体时,用户 2 是否有可能以“未同步状态”读取这些实体,我的意思是当一个实体已更新但另一个实体尚未更新时?
我认为它可能很复杂,所以我会尝试更多地解释它:
在我的应用程序中,共享实体必须同步。例如。有两个共享实体,例如:
entity1 = {a=1,b=2,c=3,d=4}
实体2 = {a=5,b=6,c=7,d=8}
现在 User1 想要更新这些实体,例如到这个状态:
entity1 = {a=0,b=0,c=0,d=0}
entity2 = {a=0,b=0,c=0,d=0}
。当 User1 进行更新事务时,User2 想要获取这些共享实例并
我想避免 User2 在这种状态下读取这些实体:
entity1 = {a=0,b=0,c=0,d=0}
entity2 = {a=5,b=6,c=7,d=8}
如您所见,entity1 已更新,但 entity2 未更新。是我申请中的一个临界点,不可能出现这种情况。我怎样才能避免这种情况? hibernate 会解决这个问题吗?
提前谢谢你。
【问题讨论】: