并发问题

本文关键字:问题 并发 | 更新日期: 2023-09-27 18:23:57

我们正在使用WPF/C#和SQL创建一个客户端-服务器应用程序。在这里,我们生成一个唯一的数字b检查DB(为了获得最后一个最大数字),并使用该最大值,我们递增"1"并将值存储在DB中。此时,另一个用户也在同一屏幕上工作并创建唯一的数字,在某些情况下,唯一的数字会被复制并引发异常。

我们发现这是一个并发问题。

并发问题

事实上,取出一个数字,添加一个数字并希望它仍然没有使用是一种线程竞争和多个客户端之间的竞争,应该避免。

选项:

  • 在数据库中使用IDENTITY列,并让数据库在INSERT期间自己生成值;数据库服务器知道如何安全可靠地执行此操作
  • 如果这不可能,您可能希望将此代码延迟到准备好INSERT,这样它就成为单个数据库操作的一部分——即使这样,如果它不在"可序列化事务"中(具有键范围读取锁等),然后你必须循环到"获取最大值,增量,尝试插入,但请注意,我们可能已经输掉了一场比赛,所以只有在值不存在的情况下才插入-可能是这样;如果不成功,从开始重复"
  • 或者,您可以在第一次需要数字时创建新记录(即使其他数据不可用),注意您可能仍然需要"循环直到成功"的方法

坦率地说,IDENTITY列方法是最简单的。

最后,我们使用带锁的Singleton模式来解决这个问题。

谢谢。