【问题标题】:Concurrency issue并发问题
【发布时间】:2013-07-20 07:07:56
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是什么关系型数据库?您还介意发布一些代码来更好地说明您的方法吗?
  • 客户端是如何生成一个数字的?,这个数字总是保存在数据库中的同一张表中?
  • 一般的想法是这个生成过程应该在服务器上而不是在客户端上实现。为了给你更详细的解释,我至少需要知道你使用什么数据库系统

标签: c# sql wpf multithreading concurrency


【解决方案1】:

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

选项:

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

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

【讨论】:

    【解决方案2】:

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

    谢谢。

    【讨论】:

    • 这并不能以任何方式回答这个问题。请发布更完整的答案,详细说明您为解决该问题所采取的步骤,否则此答案和可能的问题对未来的访问者几乎没有价值。
    猜你喜欢
    • 1970-01-01
    • 2011-08-31
    • 2013-07-26
    • 2013-12-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多