小编Tim*_*ter的帖子

外键会导致死锁并阻碍 READ COMMITTED SNAPSHOT 吗?

这是一个后续问题:https : //stackoverflow.com/questions/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically

尽管READ_COMMITTED_SNAPSHOT ON.

所以我有两个问题:

  1. 我如何检查事务隔离级别快照是否按预期工作/完全正常工作?
  2. 我假设外键(在 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 tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
        [fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server deadlock

20
推荐指数
1
解决办法
4099
查看次数

为什么多个 COUNT 比使用 CASE 的一个 SUM 快?

我想知道以下两种方法中哪一种更快:

1) 三COUNT

 SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d
                  WHERE d.Status = 'Approved'),
        Valid    = (SELECT COUNT(*) FROM dbo.Claims d
                    WHERE d.Status = 'Valid'),
        Reject   = (SELECT COUNT(*) FROM dbo.Claims d
                    WHERE d.Status = 'Reject')
Run Code Online (Sandbox Code Playgroud)

2)SUM带 -FROM子句:

SELECT  Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END),
        Valid    = SUM(CASE WHEN Status = 'Valid'    THEN 1 ELSE 0 END),
        Reject   = SUM(CASE WHEN Status = 'Reject'   THEN 1 ELSE …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2005 sql-server t-sql

14
推荐指数
1
解决办法
4298
查看次数

如何隐藏/禁用表而不删除它们以检查冗余?

我必须维护和扩展一个旧的遗留系统,其中包含不再使用的 web 服务方法和数据库表。由于我不完全确定这些表是否真的是多余的,因此我害怕删除它们。

有没有其他方法可以在不删除它们的情况下实现相同的效果(不能再使用表格)?我的想法是将它们Deleted从当前默认的dbo.

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Deleted')
BEGIN
   EXEC('CREATE SCHEMA Deleted')
END

ALTER SCHEMA Deleted TRANSFER dbo.TableName;
Run Code Online (Sandbox Code Playgroud)

有没有其他选择或者模式方法有什么缺点?

database-design sql-server t-sql sql-server-2012

12
推荐指数
3
解决办法
3811
查看次数

更新多个连接表的视图

由于 MSDN 没有说太多,如果我执行以下查询会发生什么?

update claims set status='Awaiting Auth.'
where status = 'Approved' 
Run Code Online (Sandbox Code Playgroud)

我可以使用ClaimStatusName链接表的列dimClaimStatus来更新通过外键引用的主表吗?

视图本身查询多个表,主表是tabData,我也想用上面的查询更新。我想改变fiClaimStatustabData从FK该手段 Approved在引用表dimClaimStatusAwaiting Auth.。它是这样工作的吗?

tabData 中的每一行只能有一个视图行。

这是视图:

CREATE VIEW [dbo].[Claims] 
AS 
  SELECT mu.MarketUnitName AS MarketUnit, 
         c.CountryName     AS Country, 
         gsp.GSPName       AS GSP, 
         gsp.WCMSKeyNumber AS GspNumber, 
         sl.SLName         AS SL, 
         sl.WCMSKeyNumber  AS SlNumber, 
         m.ModelName       AS Model, 
         m.SalesName       AS [Model-Salesname], 
         s.ClaimStatusName AS [Status], 
         d.Work_Order      AS [Work Order], 
         d.SSN_Number      AS IMEI, 
         .... more columns ....
         idData,         -- …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server t-sql view update

6
推荐指数
1
解决办法
1万
查看次数