Sql server 2005 使用SQLServer作为资源锁定机制
给定一个逻辑资源标识符表(每行一个),任意数量的数据库客户端执行以下操作的最佳方式是什么:Sql server 2005 使用SQLServer作为资源锁定机制,sql-server-2005,locking,resources,Sql Server 2005,Locking,Resources,给定一个逻辑资源标识符表(每行一个),任意数量的数据库客户端执行以下操作的最佳方式是什么: 声明对特定资源的访问权(如果尚未声明) 选择下一个可用资源并申请(与上面类似) 释放以前声明的资源 (该表将有一个“索赔人”列,在无人索赔行中为空。) 我被这些操作的原子性所困扰:在选择请求的/下一个可用资源之前(以及之后的更新,假设声明成功),我是否需要一个完整的表锁,或者是否有更细粒度的方法来实现这一点?我现在没有大量的数据,但我更愿意尽可能地保持表的可访问性 > P>基本上描述了一个基于经典队列
- 声明对特定资源的访问权(如果尚未声明)
- 选择下一个可用资源并申请(与上面类似)
- 释放以前声明的资源
我被这些操作的原子性所困扰:在选择请求的/下一个可用资源之前(以及之后的更新,假设声明成功),我是否需要一个完整的表锁,或者是否有更细粒度的方法来实现这一点?我现在没有大量的数据,但我更愿意尽可能地保持表的可访问性 > P>基本上描述了一个基于经典队列的工作流,您应该考虑使用Realth. 为了便于讨论,以下是您如何实现自己的愿望:
- 声明特定资源:
。如果已声明资源,则将阻止。如果资源已声明,则使用锁定超时返回异常<代码>键必须索引且唯一选择。。。来自具有(UPDLOCK,ROWLOCK)的资源,其中key=@key
- 下一个可用资源:
选择。。。从资源中取而代之的是(UPDLOCK、ROWLOCK、readpass)ORDER BY,但要正确地实现这一点要困难得多。您需要在资源的字符串描述符上请求应用程序锁,如键值,或键或其值的
必须索引且唯一校验和。应用程序锁允许您通过在“会话”作用域请求应用程序锁,将“声明”的作用域与事务分开,但随后您必须手动释放声明(“事务”作用域的应用程序锁在提交时释放)。但是,有一千种方法可以在应用程序锁的情况下拍摄自己的脚。
基本上描述了一个基于经典队列的工作流,你应该考虑使用一个Real.p> 为了便于讨论,以下是您如何实现自己的愿望:
- 声明特定资源:
。如果已声明资源,则将阻止。如果资源已声明,则使用锁定超时返回异常<代码>键选择。。。来自具有(UPDLOCK,ROWLOCK)的资源,其中key=@key
- 声明特定资源:
- 下一个可用资源:
选择。。。从资源中取而代之的是(UPDLOCK、ROWLOCK、readpass)ORDER BY,但要正确地实现这一点要困难得多。您需要在资源的字符串描述符上请求应用程序锁,如键值,或键或其值的
校验和。应用程序锁允许您通过在“会话”作用域请求应用程序锁,将“声明”的作用域与事务分开,但随后您必须手动释放声明(“事务”作用域的应用程序锁在提交时释放)。不过请注意,有上千种方法可以通过应用程序锁攻击你自己。SQL Server有一个名为的内置存储过程。文档将其描述为 锁定应用程序资源 客户机可以竞争指定的锁(您可以给它指定您想要的名称),一旦锁被持有,就可以执行所需的操作。如果客户端崩溃,锁将自动释放。要以编程方式释放锁,可以调用 使用applocks的可行解
- 如果索赔人为空,请尝试获取同名的applock
- 如果获得了applock,则使用您的claiment id更新该行
- 声明行后,释放applock,因为现在已经声明了,没有其他客户端会尝试声明它
- 完成后,将claiment更新为null
- 如果索赔人为空,请尝试获取同名的applock
- 如果获得了applock,则使用您的claiment id更新该行
- 声明行后,释放applock,因为现在已经声明了,没有其他客户端会尝试声明它
- 完成后,将claiment更新为null