避免并发删除死锁

     2023-03-22     215

关键词:

【中文标题】避免并发删除死锁【英文标题】:Avoid deadlock for concurrent delete 【发布时间】:2013-02-25 18:12:44 【问题描述】:

我有一个名为Products 的表,其中包含许多列。它是用于报告目的的临时表。多个用户请求将同时处理数据到该表。有单独的存储过程可以对该表进行 DML 操作。

表结构:

CREATE TABLE Products (
  instance uniqueidentifier,
  inserted datetime,
  col1, 
  col2,
  ...
)

inserted 列将填充 GETDATE() 以包含插入每一行的时间,instance 列将包含来自 newid() 的值。一个用户请求将有一个唯一的 id,但可能有数百万行。以下是将并发执行的查询,这会导致死锁。请指教

查询 1:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
DELETE P 
FROM Products (NOLOCK) 
WHERE instance = 'XXXX-xxx-xxx-xx'

查询 2:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
DELETE P 
FROM Products (NOLOCK) 
WHERE inserted <= DATEADD(hh, -10, GETDATE())

注意:非聚集索引是在实例列上创建的。

请告诉我在这种情况下我可以使用哪种锁。

请注意,当我向表中插入 1000 万行时,我无法主键,因为它会消耗时间(这是一个事务;有 20 个并发事务)。 报告应尽快生成。我的程序有多个 35 个 DML 语句,大约有 15 个 DELETE 语句,例如带有其他列的实例列(DELETE FROM table WHERE instance = @instance AND col1 = @col1)。

【问题讨论】:

看看这个***.com/questions/9952137/… 【参考方案1】:

(1) 您应该停止使用read uncommitted 隔离。至少使用read committed

(2) 您可以尝试多种方法来避免死锁,例如确保您的不同事务以相同的顺序访问数据库对象等。这值得一读 - http://support.microsoft.com/kb/169960

(3) 为您的表禁用锁升级(更精细的锁因此更好的并发性,但更多的锁开销):

ALTER TABLE Products SET (lock_escalation = disable)

(4) 禁止页面锁定,并允许对索引进行行锁定(这意味着您不能对索引进行碎片整理,但您仍然可以重建它们):

ALTER INDEX [<YourIndex>] ON Product WITH (allow_row_locks = on, allow_page_locks = off)

【讨论】:

【参考方案2】:

首先,除了独占锁之外,您无法对这些删除语句使用任何锁。你的isolation level and NOLOCK hints are being ignored by Sql Server:

(Nolock) 仅适用于SELECT 语句。

两个建议:

instance 上的非聚集索引更改为聚集索引。但是,只有在您可以将 NEWID() 更改为 NEWSEQUENTIALID() 时才这样做。

其次,不要执行delete 来删除超过 10 小时的记录...考虑implementing rolling partitions。这将消除因清理与您的其他 delete 操作引起的任何争用。

【讨论】:

深入了解java并发——《javaconcurrencyinpractice》10.避免活跃性危险

...遇到的活跃性问题,本章就死锁发生的原因、诊断、避免死锁的方案进行了细致的解读。10.1死锁在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这两个线程将永远的等待下去。这种情况是最简... 查看详情

为啥并发的“删除...插入”语句会导致死锁?

】为啥并发的“删除...插入”语句会导致死锁?【英文标题】:Whyconcurrent"Delete...Insert"statementscauseadeadlock?为什么并发的“删除...插入”语句会导致死锁?【发布时间】:2019-10-2207:47:32【问题描述】:在mysql中考虑以下架... 查看详情

什么是死锁?如果避免死锁?

一、死锁的定义多线程以及多进程改善了系统资源的利用率并提高了系统的处理能力。然而,并发执行也带来了新的问题——死锁。所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都... 查看详情

死锁面试题

...互相等待对方释放资源的无限循环的情况。死锁的预防和避免可以从以下几个方面入手:避免占用不必要的资源。尽量避免占用不必要的资源,对于不需要占用的资源及时释放,减少进程之间相互等待的情况。避免持有多个资源... 查看详情

并发编程总结

这篇文章总结并发编程相关内容重入锁深入重入锁ReentrantLock死锁死锁得条件和避免多线程断点续传多线程断点续传 查看详情

并发编程总结

这篇文章总结并发编程相关内容重入锁深入重入锁ReentrantLock死锁死锁得条件和避免多线程断点续传多线程断点续传 查看详情

将共享锁升级为独占锁时避免 MySQL 死锁

】将共享锁升级为独占锁时避免MySQL死锁【英文标题】:AvoidingMySQLdeadlockwhenupgradingsharedtoexclusivelock【发布时间】:2016-12-0711:05:48【问题描述】:我使用的是MySQL5.5。我注意到在并发场景中发生了一个特殊的死锁,我认为这种死锁... 查看详情

在这种情况下如何避免死锁?

】在这种情况下如何避免死锁?【英文标题】:HowtoavoidDeadlockinthisscenario?【发布时间】:2015-04-1402:31:17【问题描述】:我有一个innoDB表,其中多个连接可能会插入数据,并且每10秒运行一次的单个MySql事件会删除一些以前插入的... 查看详情

实战并发编程-07循环等待&死锁问题

文章目录Pre什么是死锁死锁代码死锁产生的原因如何避免死锁1、破坏占用且等待条件2、破坏不可抢占条件3、破坏循环等待条件小结Pre【账户A】转账给【账户B】,同时【账户B】也转账给【账户A】,两个账户都需要锁住余额,... 查看详情

:进程管理--死锁的概念死锁饥饿死循环的区别死锁的处理策略(预防/避免死锁/死锁的检测和解除)spooling技术银行家算法

...夺条件2.1.3破坏请求和保持条件2.1.4破坏循环等待条件2.2避免死锁避免死锁同样属于事先预防策略,但并不是事先采取某种限制措施破坏死锁的必要条件,而是在资源动态分配过程中,防止系统进入不安全状态,以... 查看详情

如何避免这两个 SQL 语句之间出现死锁?

】如何避免这两个SQL语句之间出现死锁?【英文标题】:HowcanIavoidadeadlockbetweenthesetwoSQLstatements?【发布时间】:2010-06-2418:09:44【问题描述】:我有两个存储过程在不同的线程中运行,在SQLServer2005上运行。一个过程将新行插入一组... 查看详情

多线程之死锁定位及故障分析,尽可能避免线上事故(十三)

前两篇博文,我们介绍了线程池技术实现原理,这篇就够了以及线程池的拒绝策略,以及生产环境如何合理设置参数,比较彻底的介绍了线程池。我们对多线程已经介绍了很多的内容,针对多线程,高并发的分布式系统,对于共... 查看详情

多线程死锁的产生原因以及如何避免

多线程以改善了系统资源的利用率并且提高了系统的处理能力。但是,并发执行同时也带来了新的问题——死锁。所谓的死锁就是多个线程因竞争资源而造成的一种互相等待,如果没有外力作用,这些线程都将无法继续执行死锁... 查看详情

并发基础

...周期和状态5.什么是上下文切换6.什么是线程死锁,怎么避免线程死锁7.sleep()方法与wait()方法的区别8.为什么调用start()方法会自动调用run()方法,为什么不直接调用run()方法 synchronized关键字简单介绍使用方式  https://www.c... 查看详情

如何解决多线程造成的数据库死锁

...库了,只能通过sql语句杀掉锁。请问高人怎样设计程序能避免这种情况?多线程是很容易造成死锁,一般情况下死锁都是因为并发操作引起的。我不懂JAVA,但死锁这个问题每种开发工具和数据库都会碰到.解决办法是:1、程序方... 查看详情

删除然后批量插入时的 SQL 死锁

...我遇到了无法解决的SQLServer死锁问题。基本上,我有大量并发连接(来自许多机器)正在执行事务,它们首先删除一系列条目,然后使用批量插入在同一范围内重新插入条目。本质上,交易是这样的BEGINTRANSACTIONT1DELETEFROM[TableName] 查看详情

一些提示,以避免在这个pthreadedc程序中出现死锁(代码片段)

我有一个任务器,它像一个生产者和3个CPU,像消费者和共享资源。Tasker读取文件并放入共享资源,CPU执行并删除它。我使用了一个用于FIFO的环队列。我发现问题是由于条件变量,我的任务器完成后CPU线程没有终止,即他们仍在... 查看详情

进程死锁与避免

1.进程死锁的定义2.死锁的防止3.死锁的避免4.死锁的检测  查看详情