Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 使用SQLServer作为资源锁定机制_Sql Server 2005_Locking_Resources - Fatal编程技术网

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

    SQL Server有一个名为的内置存储过程。文档将其描述为

    锁定应用程序资源

    客户机可以竞争指定的锁(您可以给它指定您想要的名称),一旦锁被持有,就可以执行所需的操作。如果客户端崩溃,锁将自动释放。要以编程方式释放锁,可以调用

    使用applocks的可行解

    • 如果索赔人为空,请尝试获取同名的applock
    • 如果获得了applock,则使用您的claiment id更新该行
    • 声明行后,释放applock,因为现在已经声明了,没有其他客户端会尝试声明它
    • 完成后,将claiment更新为null

    谢谢你的回答。队列是不合适的,因为它们本质上是永久资源。此外,我还应该澄清,客户机将在任意时间段内(包括多个SQL会话)声明资源;这就是“索赔人”栏出现的地方。但听起来像是使用事务+UPDLOCK/ROWLOCK,我可以检查claimer列是否为非NULL、写入和提交。队列不需要存储资源,而是通知工作流处理资源可用性的事件。处理器拾取队列消息(即“事件”),然后对资源执行操作。完成后,将在队列上放置一个新事件,表示资源可用于工作流的下一阶段。或者他们在队列中放置一个计时器(),以便在特定时间后恢复该特定资源上的工作流。在我的例子中,声明将持续声明过程的整个生命周期——我使用它在多个服务器之间拆分数据层次结构。但听起来我无论如何都应该读一读关于排队的书。谢谢你的帮助,谢谢你的回答。队列是不合适的,因为它们本质上是永久资源。此外,我还应该澄清,客户机将在任意时间段内(包括多个SQL会话)声明资源;这就是“索赔人”栏出现的地方。但这听起来像是一个事务+U