小编Mar*_*cus的帖子

同一个表上的两个 INSERT 和一个 CHECK CONSTRAINT 导致非聚集键上的 SQL 死锁

在 INSERT 期间一直在努力解决表上的死锁问题。它是一个多租户数据库,并启用了读提交快照隔离 (RCSI)。

死锁图

INSERT 时有一个 CHECK CONSTRAINT 以确保没有重叠的预订(通过 smalldatetime 与事件无关)执行标量值函数并检查结果为 1。此约束使用 READCOMMITTEDLOCK 提示查找同一个表以检查违反了 ID(PK/聚集索引)不等于新插入行的 ID 的逻辑。

由于启用了 RCSI 并希望确保我们不会跳过可能导致重叠预订的行,因此使用了 READCOMMITTEDLOCK 提示。

该约束对导致死锁的索引执行 INDEX SEEK:idx_report_foobar。

任何帮助将不胜感激。

这是 XML(已调整以删除数据库中表字段的一些逻辑和名称):

<deadlock>
 <victim-list>
  <victimProcess id="process91591c108" />
 </victim-list>
 <process-list>
  <process id="process91591c108" taskpriority="0" logused="1328" waitresource="KEY: 9:72057594095861760 (c2e966d5eb6a)" waittime="3046" ownerId="2628292921" transactionname="user_transaction" lasttranstarted="2018-03-09T14:24:13.820" XDES="0x708a80d80" lockMode="S" schedulerid="10" kpid="8964" status="suspended" spid="119" sbid="2" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-03-09T14:24:13.823" lastbatchcompleted="2018-03-09T14:24:13.820" lastattention="1900-01-01T00:00:00.820" clientapp=".Net SqlClient Data Provider" hostname="SERVERNAMEHERE" hostpid="33672" loginname="DOMAIN\USERHERE" isolationlevel="read committed (2)" xactid="2628292921" currentdb="9" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="mydb.dbo.CheckForDoubleBookings" line="12" stmtstart="920" stmtend="3200" …
Run Code Online (Sandbox Code Playgroud)

performance index sql-server deadlock index-tuning

5
推荐指数
1
解决办法
1547
查看次数

我可以批量更新每个日期时间吗?

当前数据库假定所有时间都是用户本地的。现在我们正在更改它,以便数据库以 UTC 存储所有内容,我们的应用程序将数据库中的 UTC 时间转换为每个用户的正确时区。

现在我们需要将数据库中的每个日期时间更新为 UTC 时间。有没有比让我们的应用程序(具有时区库)单独更新每个应用程序更好的方法?

由于夏令时 (BST),简单的 DATEADD 不是一种选择。大约有 1000 万个单元格需要更新。

performance sql-server sql-server-2008-r2

3
推荐指数
1
解决办法
2160
查看次数

相当于本地数据库的 Azure SQL 威胁检测

由于 GDPR,我们正在寻找一种方法来帮助识别来自我们生产 SQL Server 的恶意活动或数据泄露。

如果我们使用 Azure,这似乎是一个开关轻弹。

什么可用于本地服务器?

security sql-server

3
推荐指数
1
解决办法
359
查看次数