使用的node.js + sequelize.js + MSSQL许多更新得到死锁错误
我做的每5秒3个线程许多更新〜30(一个表)。设备轮询。
获取
SequelizeDatabaseError: Transaction (Process ID 57) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
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](https://stackoverflow.com/questions/7843733/confused-about-updlock-holdlock)可能会有所帮助。你使用HOLDLOCK会阻塞INSERT和UPDATE,而使用UPDLOCK只会阻塞UPDATE。你应该跟踪那个spid并且找出它是否是失败的'INSERT'或'UPDATE'。 – Phoenix
我编写'Model.update(item,{Id:item.Id})',但sequelize.js生成'HOLDLOCK'。我写了'Model.upsert',也得到了死锁错误 –