在 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) 当前数据库假定所有时间都是用户本地的。现在我们正在更改它,以便数据库以 UTC 存储所有内容,我们的应用程序将数据库中的 UTC 时间转换为每个用户的正确时区。
现在我们需要将数据库中的每个日期时间更新为 UTC 时间。有没有比让我们的应用程序(具有时区库)单独更新每个应用程序更好的方法?
由于夏令时 (BST),简单的 DATEADD 不是一种选择。大约有 1000 万个单元格需要更新。
由于 GDPR,我们正在寻找一种方法来帮助识别来自我们生产 SQL Server 的恶意活动或数据泄露。
如果我们使用 Azure,这似乎是一个开关轻弹。
什么可用于本地服务器?