【发布时间】:2017-08-07 18:31:39
【问题描述】:
使用 node.js + sequelize.js + mssql
我每 5 秒从 3 个线程更新约 30 次(一张表)。设备轮询。
获取
SequelizeDatabaseError:事务(进程 ID 57)已死锁 用另一个进程锁定资源并被选为 僵局受害者。重新运行事务。
sequelize 生成sql
sql:
SET IDENTITY_INSERT [DeviceCurrentData] ON;
MERGE INTO [DeviceCurrentData] WITH (HOLDLOCK) AS [DeviceCurrentData_target]
USING (
VALUES (
9,
N\ '28.300000\',
\ '2017-08-07 15:26:28.000\',
12
)
) AS [DeviceCurrentData_source]([Id], [Value], [DateStamp], [DevParamId])
ON [DeviceCurrentData_target].[Id] = [DeviceCurrentData_source].[Id]
WHEN MATCHED
THEN
UPDATE
SET [DeviceCurrentData_target].[Value] = N\ '28.300000\',
[DeviceCurrentData_target].[DateStamp] = \ '2017-08-07 15:26:28.000\',
[DeviceCurrentData_target].[DevParamId] = 12
WHEN NOT MATCHED
THEN
INSERT (
[Id],
[Value],
[DateStamp],
[DevParamId]
)
VALUES (
9,
N\ '28.300000\',
\ '2017-08-07 15:26:28.000\',
12
)
OUTPUT $ACTION,
INSERTED.*;
SET IDENTITY_INSERT [DeviceCurrentData] OFF;
'
【问题讨论】:
-
This previous answer 可能会有所帮助。您使用
HOLDLOCK会阻止INSERT和UPDATE,而使用UPDLOCK只会阻止UPDATE。您应该跟踪该 spid 并找出失败的是INSERT还是UPDATE。 -
我写了
Model.update(item, {Id: item.Id}),但是sequelize.js 生成了HOLDLOCK。我写了Model.upsert,也出现死锁错误
标签: sql-server node.js sequelize.js