2

我正在使用带有 VS2010 终极 C# 的 SQL Server 2008 R2 Express。它是一个注册患者的客户端服务器架构软件。有 4 个客户,其中 4 个用户正在注册患者。当 2 个用户注册 2 个单独的患者并点击保存按钮时,我正在执行以下步骤,

  1. 系统提取下一个注册号。
  2. 用那个注册号保存记录。进入 SQL Server 表
  3. 再次拉下一个注册号。为下一位患者

如果两个用户同时按下保存按钮,那么 SQL Server 应该将他们放入队列中,不管两个用户同时点击保存按钮的脸,SQL Server 应该执行第一个病人的插入命令,然后生成下一个数字,第二个插入命令应该在第一个旁边执行。这样第二个查询就可以拉下一个注册号,然后保存记录。但它正在保存两个具有相同注册号的患者。我什至用过BeginTransactionCommit而且也用过,Rollback但我仍在修复中。任何帮助将不胜感激。

4

1 回答 1

3

您在两个单独的执行线程中读取下一个注册号不是问题。我对sql server了解不多,但看来读取并没有应用任何形式的锁,所以两个线程都得到了相同的值。

一种方法是执行以下操作

  • 开始交易
  • 更新下一个注册号(加1)
  • 读回值
  • 在插入中使用它
  • 犯罪

初始更新锁定包含下一个注册号的行,阻止任何其他线程读取它。“其他”线程将等待锁被释放(形成您在帖子中提到的队列),然后继续,在插入时分配下一个注册号。

于 2013-09-30T14:16:32.320 回答