在SQL Server中手动处理锁定?

时间:2011-07-26 06:50:49

标签: sql sql-server sql-server-2005 sql-server-2008

我是SQL Server的新手,但我对select / update / delete和其他事务这样的简单事情非常了解。我在我的应用程序中面临死锁情况。我已经理解了这个场景,因为许多线程并行尝试运行一组更新操作。它不是单个更新,而是一组更新操作。

我已经明白,在我的应用程序中无法避免这种情况,因为许多人希望同时进行更新。所以我想要一个手动锁系统。首先,线程1应检查手动锁是否可用,然后启动事务。意思是如果第二个线程请求锁定它应该是忙的,因此第二个线程应该等待。第一个完成后,第二个应该获得锁定并从事务开始。

这只是我想到的一个逻辑。但我不知道如何在SQL Server中执行此操作。有没有可以帮助我的例子。如果您能给我一些示例sql脚本或链接对我有用,请告诉我。感谢您的时间和帮助。

3 个答案:

答案 0 :(得分:2)

你可能的意思是“信号量”。也就是说,将DML的执行序列化为一次只能运行一个进程。

这在SQL Server中使用sp_getapplock

是本机的

您可以将第二个进程配置为在调用sp_getapplock时等待或失败,并且它也可以在“事务”模式下自动取消。

答案 1 :(得分:1)

您仍然很可能最终会遇到同样的情况。根据你的裁缝锁定死锁。 SQL Server内部实现了一个非常强大的锁定机制。你应该使用它。

您遇到的问题是不同的事务/线程以冲突的顺序访问(或修改)资源(表,索引等)。

如果你创建了自己的锁定机制,你最终可能会死锁。例如:

  1. 主题1在客户记录
  2. 上创建锁定
  3. 线程2在订单记录
  4. 上创建锁定
  5. 线程1尝试在订单记录上创建锁定(但由于步骤2而无法继续)
  6. 线程2尝试在客户记录上创建锁定(但由于步骤3而无法继续)
  7. Voila ......僵局

    解决方案是重构资源的访问方式,因此总是以相同的顺序访问记录,问题就会消失。

    1. 主题1在客户记录
    2. 上创建锁定
    3. 线程2尝试在客户记录上创建锁定(但由于步骤1而无法继续)
    4. 主题1在订单记录
    5. 上创建锁定
    6. 线程1完成交易并解锁订单和客户记录
    7. 主题2在客户记录
    8. 上创建锁定
    9. 线程2在订单记录
    10. 上创建锁定

      另外,请查看here以了解如何在单个表上进行锁定。

答案 2 :(得分:0)

您手动锁定系统听起来很有趣,但您需要知道它会牺牲并发性,这对于许多OLT​​P应用程序来说非常重要。

像Oracle和SQL服务器这样的高级数据库非常适合避免死锁并为您提供解决死锁的工具,这可以帮助您终止导致死锁的会话,并让其他查询首先完成它的工作。 / p>

Microsoft包含可在此处找到的文档。 http://support.microsoft.com/kb/832524

此外,还有许多其他可能导致僵局的原因。你可以在这里找到一些例子。 how to solve deadlock problem?