sql-server – 外键是否会导致死锁并阻碍READ COMMITTED SNAPSHOT?

前端之家收集整理的这篇文章主要介绍了sql-server – 外键是否会导致死锁并阻碍READ COMMITTED SNAPSHOT?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是一个来自 https://stackoverflow.com/questions/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically的后续问题

虽然READ_COMMITTED_SNAPSHOT ON,但在同时运行大型报表时,我仍然在ASP.NET应用程序中出现死锁/超时情况.

所以我有两个问题:

>我如何检查Transaction Isolation Level Snapshot是否按预期工作?
>我假设外键(在Web-Application表中的报表)负责死锁.我找到了this interesting article

Note sql Server acquires shared locks when validating foreign keys,
even if the transaction is using read committed snapshot (read
committed using row versioning) or snapshot isolation level. Be
mindful of this when examining deadlock graphs from transactions when
these transaction isolation levels are used. If you see shared locks,
check to see whether the locks are taken on an object that is
referenced by a foreign key.

我如何检查FK是否真的对死锁/超时情况负责,这是否意味着我可以删除这些外键以防止死锁(什么是可接受的努力)?

注意:我只是从导致死锁的表中读取.

对此主题的任何想法都非常感谢.

编辑Here is a Deadlock-Graph.也许有人可以帮我理解导致死锁的原因.似乎它发生时没有任何报告只由web应用程序引起,当两个事务想要写同一个表时(一个更新和一个插入,插入是存储过程).为什么它只获取页锁以及如何仅启用行锁? Insert-SP使用TRANSACTION ISOLATION LEVEL REPEATABLE READ.

我强烈怀疑两个触发器(一个更新和一个插入)是造成死锁的原因.这是insert-trigger:

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 tdefDate 
        WHERE CONVERT(VARCHAR,INSERTED.POP_Date,[fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR,INSERTED.Manufacture_Date,112) = tdefDate.Text)
    FROM INSERTED;
END

因此,此触发器更新RMA-Table导致更新触发器触发的原因(类似).死锁图是否证实了我的假设?我想我会删除那些触发器并创建一个每天运行一次的SP,这是完全足够的,因为这些列仅适用于SSAS-Cube(Molap).

编辑:顺便说一句,因为我删除了这些触发器,所以没有死锁:)

解决方法

如果sqlCAT团队说使用读取提交隔离完成FK验证,那么他们必须知道他们在谈论什么.强调验证.真正的问题是为什么报告会触发FK验证?验证发生在写入上,报告应该是读取.您的报告都会导致写入,在这种情况下,快照隔离级别将无效,导致死锁的原因也不同.

取得进展的唯一方法是捕获死锁图.

至于另一个问题,如何检查你是否在快照隔离下运行:查看sys.dm_tran_active_snapshot_database_transactions.

猜你在找的MsSQL相关文章