gpt4 book ai didi

database - Nhibernate IList(有序列表)竞争条件

转载 作者:太空狗 更新时间:2023-10-30 01:56:25 24 4
gpt4 key购买 nike

想象一下这个场景:

  1. 实体上的有序集合。
  2. 对集合中新项目的两个同时(异步)CREATE 请求
  3. 两个新项目的序号相同。

集合是这样的:

public virtual IList<CustomField> CustomFields { get; protected set; }

我有这样流畅的 nhibernate 映射:

mapping.HasManyToMany(cp => cp.CustomFields)
.AsList(i => i.Column("CustomFieldOrdinal"))
.ParentKeyColumn("RegistrationId")
.ChildKeyColumn("CustomFieldId");

原因是 nhibernate 正在查询数据库以获取下一个可用的序号并且表上没有锁,并且两者都获得相同的序号。

如何预防?

最佳答案

数据库中的唯一索引/约束可以解决这个问题。当然,您随后必须处理两个请求之一的刷新失败。

如果您想避免在应用程序端处理异常,您可以改为(或进一步)在持有列表的实体上发出独占数据库锁 (ISession.Lock(entity, LockMode.Upgrade)) 在读取(或从数据库刷新)其列表状态之前。然后,更新列表。
如果所有插入列表的应用程序都遵循相同的模式,它们将无法同时插入具有相同索引的元素:它们将等待锁被释放,然后在读取新数据之前将其放入 db 中,然后插入自己的新元素。
这是 pessimistic concurrency pattern .阅读更多 here too (链接在此 other answer 上找到)。

乐观的需要使用行版本列,并确保任何列表更新都触及实体版本。但是在并发的情况下,您将遇到两个请求之一的并发异常。

关于database - Nhibernate IList(有序列表)竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36604751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com