【问题标题】:Table gets locked while updating simultaneously表在同时更新时被锁定
【发布时间】:2017-10-06 11:22:12
【问题描述】:

我有一个在医院/类似机构中显示令牌队列的应用程序。它为访客颁发部门明智的令牌编号。为此,我们有下表,其中包含最后发行的令牌编号。

HospId  Int Not Null
DeptId  Int Not Null
TokenId Int Not Null /* current token number */

在颁发令牌时,我执行以下更新语句

Update <table> Set TokenId = (Select Max(TokenId) + 1 From <table>)
Where HospId = @HospId And DeptId = @DeptID

这工作正常,但是当有更多并发用户(超过 200 个用户)更新令牌时,它会挂起。有没有更好的更新方式?

【问题讨论】:

  • 你有没有遇到过这个东西发出两个相同的令牌?如果它从未这样做,我会感到惊讶。更可靠的解决方案是使用具有标识或序列的表。
  • @Nick.McDermaid sequence 在 sql server 2012 中引入。
  • 我的错误我没有阅读标签....而且我实际上不记得它是什么时候介绍的!
  • @Nick.McDermaid 不用担心。在我重新阅读问题之前,我实际上使用序列写了一个答案。
  • 此外,身份方法不会为您提供医院和部门独有的序列号。但仔细想想 - 你真的需要吗?

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

如果您不能使用自动递增数字,则将令牌生成代码放在使用 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 的存储过程中可能是一个可行的选择。

它会减慢速度,但应该可以防止并发问题。

存储过程的原因是,通过禁用应用程序用户对表的直接写入权限,并仅通过EXECUTE AS OWNER (msdn) 允许存储过程写入,您保证不会有任何有趣的事情发生和流氓代码在您的令牌生成中戳洞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-05-26
    相关资源
    最近更新 更多