-1

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

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

4

2 回答 2

0

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

选项:

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

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

于 2013-07-20T07:38:44.277 回答
-1

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

谢谢。

于 2015-02-16T04:26:12.497 回答