为SQL Server设计一个锁,以帮助缓解插入和选择之间的冲突

为SQL Server设计一个锁,以帮助缓解插入和选择之间的冲突,sql,sql-server,deadlock,Sql,Sql Server,Deadlock,SQL Server是SQL Azure,基本上是SQL Server 2008,用于正常进程 我有一个名为TASK的表,不断地在(新任务)中添加新数据,并删除(任务完成) 对于中的新数据,我使用INSERT-in。。选择…,大多数时间都很长,比如说十几分钟 对于旧数据输出,我首先使用SELECT(WITH NOLOCK)获取任务,UPDATE让其他线程知道此任务已经开始处理,然后在完成后使用DELETE 死锁有时发生在SELECT上,大多数时间发生在UPDATE和DELETE上 这不是一项时间

SQL Server是SQL Azure,基本上是SQL Server 2008,用于正常进程

我有一个名为
TASK
的表,不断地在(新任务)中添加新数据,并删除(任务完成)

对于中的新数据,我使用
INSERT-in。。选择…
,大多数时间都很长,比如说十几分钟

对于旧数据输出,我首先使用
SELECT(WITH NOLOCK)
获取任务,
UPDATE
让其他线程知道此任务已经开始处理,然后在完成后使用
DELETE

死锁有时发生在
SELECT
上,大多数时间发生在
UPDATE
DELETE


这不是一项时间紧迫的任务,所以我可以在所有插入完成后开始处理新数据。是否有任何类型的锁可要求SELECT在插入完成之前不选择它?或任何其他避免冲突的建议。如果需要,我可以重新设计表。

如果这是一个处理队列,请考虑使用ServiceBroker

影响性能和锁定的因素有很多。我推测数据将在单独的会话中更新和删除。插入会话和删除会话正在使用哪个事务隔离级别

当删除会话运行时,插入会话和所有事务是否已提交并关闭?是否有多个删除会话同时运行?在用于标识SELECT/UPDATE/DELETE语句的任务的列上有一个索引是非常重要的,特别是当您移动到更高的隔离级别(如可重复读取或序列化)时


如果合适的话,所有这些问题都可以通过转到ServiceBroker来解决

在sqlserver2005之后,解析锁很容易。 冲突 1.您可以使用服务代理。 2.使用隔离级别

dbcc useroptions,在最后一行,您可以看到deflaut隔离级别为read_committed,这是会话级别。 在sqlserver中,我们可以将级别更改为读取冲突的提交快照,而不是像oracle那样的实际行锁。但我们可以使用此方法实现

更改数据库DBName 将已提交的快照设置为打开

打开此功能,必须在单用户schame中

你可以测试它。 关于A、B阶段

A:使用(Xlock)更新table1集合名称='new',其中id=1 B:您仍然更新其他行并从表中选择所有数据

我的英语不是很好,但对于洛克来说,我知道

在sqlserver中,对于函数,有三个锁。 1.如果要锁定,请使用时间戳(rowversion)控件。 2.悲观锁定,使用日期时强制锁定。使用Ulock、Xlock等。 3.虚拟锁,使用程序getapplock()


如果您需要在系统架构中锁定schame,请发送电子邮件给我:mjjjj2001@163.com

选择…不锁定。。。根据定义,不能建立锁,因此死锁中不应该有任何部分。你是说插入…选择。。。是死锁的一部分吗?我想发生的是:更新或删除仍在插入过程中的行。所以,如果不首先选择它,那么就不会有更多的死锁。所有这些都应该在读一致模式下完成。因此,在插入中间但尚未提交的任何东西不能被另一事务删除。“几十分钟”意味着巨大的表、笨拙的进程和/或缺少或缺少索引。这里可能会发生很多事情。在给出比一般意见更好的意见之前,我们需要知道更多。SELECT/UPDATE/DELETE是并发的。唯一的INSERT是singleton。是否有方法锁定行并将其标记为无法选择,然后在插入后解锁(取消标记)。这里有索引,我知道并发是问题的根本原因,但为了性能,我必须使用并发进程。我想我的问题可以简单地问:有没有办法在插入完成之前使行不可选择?它默认为不可选择。但是通过将
与(nolock)
一起使用,您可以覆盖它。如果要锁定行,为什么要使用nolock?