Questions tagged «deadlock»

由两个或多个进程无法进行操作(并因此释放其锁)导致的情况,因为它们被另一个进程所拥有的资源上的锁所阻塞。

6
死锁的主要原因是什么,可以防止死锁吗?
最近,我们的一个ASP.NET应用程序显示了一个数据库死锁错误,要求我检查并修复该错误。我设法找到导致死锁的原因是存储过程正在严格更新游标中的表。 这是我第一次看到此错误,并且不知道如何有效地跟踪和修复它。我尝试了所有可能的方法,最后发现正在更新的表没有主键!幸运的是,这是一个身份专栏。 后来,我发现为脚本编写部署脚本的开发人员陷入困境。我添加了一个主键,问题就解决了。 我感到很高兴,回到了我的项目,并做了一些研究以找出造成这种僵局的原因... 显然,导致死锁的是循环等待条件。没有主键的更新显然要比使用主键的更新花费更长的时间。 我知道这不是一个明确的结论,这就是为什么我在这里发布... 缺少主键是问题所在吗? 除了互斥,保留和等待,没有抢占和循环等待之外,还有其他导致僵局的条件吗? 如何防止和跟踪死锁?

5
在SQL Server中处理并发访问键表而没有死锁
我有一个表,该表被旧版应用程序用来替代IDENTITY其他各种表中的字段。 表格中的每一行都存储了中LastID名为的字段的最后使用ID IDName。 有时,存储的proc会陷入死锁-我相信我已经构建了适当的错误处理程序;但是我很想知道这种方法是否像我认为的那样起作用,或者我是否在这里树错了树。 我相当确定应该有一种访问该表的方法,而没有任何死锁。 数据库本身配置为READ_COMMITTED_SNAPSHOT = 1。 首先,这是表格: CREATE TABLE [dbo].[tblIDs]( [IDListID] [int] NOT NULL CONSTRAINT PK_tblIDs PRIMARY KEY CLUSTERED IDENTITY(1,1) , [IDName] [nvarchar](255) NULL, [LastID] [int] NULL, ); 以及该IDName字段上的非聚集索引: CREATE NONCLUSTERED INDEX [IX_tblIDs_IDName] ON [dbo].[tblIDs] ( [IDName] ASC ) WITH ( PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF …

1
SQL Server:在锁定通信缓冲区资源上死锁
这种死锁类型可能是什么原因?(一般不会出现死锁) 锁定通讯缓冲区资源 这是否表明系统内存不足并且缓冲区计数超出限制? 详细错误: 事务(进程ID 59)在锁定通信缓冲区资源上与另一个进程死锁,已被选择为死锁牺牲品。重新运行交易

5
删除/插入时,对同一排他锁定的集群键(使用NHibernate)上的SQL死锁
我已经在这个僵局问题上研究了好几天了,无论我做什么,它都会以一种或多种方式持续存在。 首先,一般的前提是:我们具有与VisitItems具有一对多关系的Visits。 VisitItems相关信息: CREATE TABLE [BAR].[VisitItems] ( [Id] INT IDENTITY (1, 1) NOT NULL, [VisitType] INT NOT NULL, [FeeRateType] INT NOT NULL, [Amount] DECIMAL (18, 2) NOT NULL, [GST] DECIMAL (18, 2) NOT NULL, [Quantity] INT NOT NULL, [Total] DECIMAL (18, 2) NOT NULL, [ServiceFeeType] INT NOT NULL, [ServiceText] NVARCHAR …

3
模拟死锁的代码
我正在测试我的应用程序,我需要一些代码来稳定地模拟数据库站点上的死锁(如果可能,请使用sql脚本)。 谢谢。 添加: 重现仅涉及一张表的死锁

4
合并语句自身陷入僵局
我有以下过程(SQL Server 2008 R2): create procedure usp_SaveCompanyUserData @companyId bigint, @userId bigint, @dataTable tt_CoUserdata readonly as begin set nocount, xact_abort on; merge CompanyUser with (holdlock) as r using ( select @companyId as CompanyId, @userId as UserId, MyKey, MyValue from @dataTable) as newData on r.CompanyId = newData.CompanyId and r.UserId = newData.UserId and …

2
外键会导致死锁并阻碍“读取已提交的快照”吗?
这是来自以下方面的后续问题:https : //stackoverflow.com/questions/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically 尽管同时运行大型报表时,我仍然在ASP.NET应用程序中遇到死锁/超时的情况READ_COMMITTED_SNAPSHOT ON。 所以我有两个问题: 如何检查“ 事务隔离级别快照”是否按预期运行/完全正常? 我假设外键(在Web应用程序表中的报表表中)引起死锁。我发现这篇有趣的文章: 注意 SQL Server在验证外键时会获取共享锁,即使该事务使用的是读取提交的快照(使用行版本控制读取的提交)或快照隔离级别。当使用这些事务隔离级别检查来自事务的死锁图时,请注意这一点。如果看到共享锁,请检查是否对由外键引用的对象进行了锁定。 如何检查FK是否真正引起了死锁/超时情况,这是否意味着我可以删除那些外键以防止死锁(这是可以接受的工作)? 注意:我只是从导致死锁的表中读取。 对此主题的任何想法都将不胜感激。 编辑 这是一个死锁图。也许有人可以帮助我了解造成僵局的原因。似乎是在没有任何报告仅由Web应用程序运行的情况下发生的,当两个事务要写入同一个表时(一个更新和一个插入,该插入与存储过程相同)。为什么要获取页锁?如何仅启用行锁?Insert-SP已使用TRANSACTION ISOLATION LEVEL REPEATABLE READ。 我非常怀疑两个触发器(一个更新和一个插入)是造成死锁的原因。这是插入触发器: CREATE TRIGGER [dbo].[CreateRMAFiDates] ON [dbo].[RMA] AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE RMA SET [fiCreationDate]=(SELECT idDate FROM tdefDate WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text), [fiPopDate]=(SELECT idDate FROM …

2
来自不同进程的相同临时表上的锁的死锁
我发现一个死锁似乎显示出我认为不可能的事情。死锁涉及两个过程: 1. process8cf948 SPID 63 在临时表#PB_Cost_Excp_Process_Invoices_Work上执行ALTER TABLE。 拥有对象ID 455743580的表#PB_Cost_Excp_Process_Invoices_Work上的IX锁 2. process4cb3708 SPID 72 在UPDATE上对临时表#PB_Cost_Excp_Process_Invoices_Work进行执行,该表应该是它自己的表的唯一副本。 在#PB_Cost_Excp_Process_Invoices_Work上拥有具有相同对象ID 455743580的 Sch-M锁! 这应该是不可能的。我想念什么吗?#Temporary表是否真的在这两个SPID之间重用? 这是在具有累积更新1(版本10.50.4260)的SQL Server 2008 R2 Service Pack 2上。 完整的未更改死锁跟踪如下。请注意,两个进程如何在具有相同表名#PB_Cost_Excp_Process_Invoices_Work_SNIP_0000000D8519的相同对象ID上进行操作: 12/14/2012 13:46:03,spid23s,Unknown,waiter id=process8cf948 mode=X requestType=wait 12/14/2012 13:46:03,spid23s,Unknown,waiter-list 12/14/2012 13:46:03,spid23s,Unknown,owner id=process4cb3708 mode=Sch-M 12/14/2012 13:46:03,spid23s,Unknown,owner-list 12/14/2012 13:46:03,spid23s,Unknown,objectlock lockPartition=0 objid=455743580 subresource=FULL dbid=2 objectname=tempdb.dbo.#PB_Cost_Excp_Process_Invoices_Work_________________________________________________________________________________0000000D8519 id=lock371705d00 mode=Sch-M associatedObjectId=455743580 12/14/2012 …

1
解决仅通过索引视图相关的2个表的死锁
我遇到了陷入僵局的情况,我想我已经缩小了罪魁祸首的位置,但是我不确定该如何解决。 这是在运行SQL Server 2008 R2的生产环境中。 为了让您对情况略有简化: 我有3个表,定义如下: TABLE activity ( id, -- PK ... ) TABLE member_activity ( member_id, -- PK col 1 activity_id, -- PK col 2 ... ) TABLE follow ( id, -- PK follower_id, member_id, ... ) 该member_activity表具有定义为的复合主键member_id, activity_id,因为我只需要以这种方式在该表上查找数据。 我也有一个非聚集索引follow: CREATE NONCLUSTERED INDEX [IX_follow_member_id_includes] ON follow ( …

2
无法破译innodb状态日志中的死锁
我们正在从Microsoft ADO.NET连接器访问MySQL。 有时,我们在innodb状态中看到以下死锁,并且无法确定问题的原因。看起来事务(2)正在等待并持有相同的锁? ------------------------ LATEST DETECTED DEADLOCK ------------------------ 110606 5:35:09 *** (1) TRANSACTION: TRANSACTION 0 45321452, ACTIVE 0 sec, OS thread id 3804 starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 368, 1 row lock(s) MySQL thread id 84, query id …

2
同时调用同一函数:死锁是如何发生的?
new_customerWeb应用程序每秒调用我的函数几次(但每个会话仅调用一次)。它要做的第一件事就是锁定customer表(执行“如果不存在,请插入”-的简单变体upsert)。 我对文档的理解是,对的其他调用new_customer应该简单地排队,直到所有先前的调用完成为止: LOCK TABLE获取表级别的锁,必要时等待释放任何冲突的锁。 为什么有时会陷入僵局呢? 定义: create function new_customer(secret bytea) returns integer language sql security definer set search_path = postgres,pg_temp as $$ lock customer in exclusive mode; -- with w as ( insert into customer(customer_secret,customer_read_secret) select secret,decode(md5(encode(secret, 'hex')),'hex') where not exists(select * from customer where customer_secret=secret) returning customer_id ) insert …

4
如何将SQL Server死锁报告中的键转换为值?
我有一个死锁报告,告诉我发生了涉及waitresource =“ KEY:9:72057632651542528(543066506c7c)”的冲突,并且我可以看到: <keylock hobtid="72057632651542528" dbid="9" objectname="MyDatabase.MySchema.MyTable" indexname="MyPrimaryKeyIndex" id="locka8c6f4100" mode="X" associatedObjectId="72057632651542528"> 在<resource-list>中。我希望能够找到密钥的实际值(例如,id = 12345)。我需要使用什么SQL语句来获取该信息?

3
有关SQL Server 2008 R2中长期运行的查询或死锁的通知?
我想知道是否可以通过死锁发送通知吗?如果是这样,将需要什么查询。我知道SQL Server可以处理死锁,我只想了解有关查询的信息。 我发现以下内容可确定长时间运行的查询: SELECT creation_time ,last_execution_time ,total_physical_reads ,total_logical_reads ,total_logical_writes , execution_count , total_worker_time , total_elapsed_time , total_elapsed_time / execution_count avg_elapsed_time ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st where total_elapsed_time >= …
15 query  deadlock 

3
我可以创建用户定义的表类型并在同一事务中使用它吗?
当我执行以下命令时(在Management Studio中,GO会将命令分成批处理) use tempdb begin tran go CREATE TYPE dbo.IntIntSet AS TABLE( Value0 Int NOT NULL, Value1 Int NOT NULL ) go declare @myPK dbo.IntIntSet; go rollback 我收到死锁错误消息。我的过程已经陷入僵局。我已经在2008、2008R2和2012中看到了这种行为。 有没有办法在创建的同一笔交易中使用我新创建的类型?

2
死锁错误未返回死锁SQL
Transaction (Process ID) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 当我的一个网站繁忙时,我会随机收到此错误。我大致知道它在哪组表上发生,但是根据我在其他程序中的经验,我通常会在发生死锁的地方返回SQL。我应该打开一个标志来允许这种情况发生吗? 我将尝试将死锁本身作为一个单独的问题进行调试,因为这是我目前的主要问题。 我正在使用SQL Server 2008标准版。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.