gpt4 book ai didi

c# - 如何编写以实体 ID 为条件的 C# 互斥 block ?

转载 作者:行者123 更新时间:2023-12-04 10:04:46 25 4
gpt4 key购买 nike

我正在寻找一种 C# 模式来编码同步操作,包括为特定实体写入两个不同的数据库,这样我就可以避免对同一实体进行同时操作的竞争条件。

例如。线程 1 和线程 2 同时处理实体 X 上的操作。该操作将 X 的信息写入数据库 A(在我的情况下,是对 MongoDB 的更新插入)和数据库 B(对 SqlServer 的插入)。线程 3 正在对实体 Y 处理相同的操作。所需的行为是:

  • 线程 1 在处理实体 X 对 A 和 B 的写入时阻塞线程 2。
  • 线程 2 等待,直到线程 1 完成对 A 和 B 的写入,然后为实体 X 写入 A 和 B。
  • 线程 3 未被阻塞,线程 1 正在处理实体 Y 的 A 和 B 写入操作

  • 我试图避免的行为是:
  • 线程 1 为实体 X 写入 A。
  • 线程 2 为实体 X 写入 A。
  • 线程 2 为实体 X 写入 B。
  • 线程 1 为实体 X 写入 B。

  • 我可以在所有线程中使用互斥锁,但我真的不想阻止不同实体的操作。

    最佳答案

    我建议使用简单的锁(如果它在代码的一个区域中)因为它将处理不同的对象(意思是 .net 对象)但具有相同的值(因为它是同一个实体)我宁愿使用某种形式实体的代码。如果实体有某种形式的代码,我会使用它 - 例如:

    但是,当然,您必须注意死锁。而 String.Intern 很棘手,因为只要应用程序运行,它就会对字符串进行实习。

    lock(String.Intern(myEntity.Code))
    {
    SaveToDatabaseA(myEntity);
    SaveToDatabaseB(myEntity);
    }

    但看起来您想要某种复制机制。然后我宁愿在数据库级别(而不是代码级别)

    [更新]

    您用信息更新了问题,它是在多台服务器上完成的。这个信息在这里很重要:) 普通锁不起作用。

    当然,您可以尝试跨不同服务器同步锁,但这就像分布式事务一样。理论上你可以做到,但大多数人只是尽可能地避免它,他们玩弄解决方案的架构来简化过程。

    [更新 2]

    您可能还会发现这很有趣: Distributed locking in .NET

    :)

    关于c# - 如何编写以实体 ID 为条件的 C# 互斥 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61642256/

    25 4 0