javascript - 我想要使用 Sequelize v5 MySQL 解决锁定行
问题描述
我这样尝试
try {
let t;
t = await db.sequelize.transaction();
let event1 = await db.EventModel.findOne(
{
where: { id: 1 }
},
{
transaction: t
}
);
let event2 = await db.EventModel.findOne({ where: { id: 1 } });
await event2.update({ event_name: "test2" });
setTimeout(async () => {
await event1.update({ event_name: "test1" }, { transaction: t });
await t.commit();
console.log("");
}, 10000);
} catch (error) {
console.log("", error);
}
这是日志数据
result before update event2 {
id: 1,
event_name: 'make event name',
createdAt: 2020-01-23T08:25:12.000Z,
updatedAt: 2020-01-26T18:02:33.000Z
}
result after update event2 {
id: 1,
event_name: 'test2',
createdAt: 2020-01-23T08:25:12.000Z,
updatedAt: 2020-01-26T18:03:59.000Z
}
result after update event1 {
id: 1,
event_name: 'test1'
createdAt: 2020-01-23T08:25:12.000Z,
updatedAt: 2020-01-26T18:04:09.000Z
}
行 event.id = 1 未锁定。
所以我尝试
try {
let t;
t = await db.sequelize.transaction();
let event1 = await db.EventModel.findOne({
where: { id: 1 },
transaction: t,
lock: {
level: t.LOCK.NO_KEY_UPDATE
}
});
let event2 = await db.EventModel.findOne({ where: { id: 1 } });
await event2.update({ event_name: "test2" });
setTimeout(async () => {
await event1.update({ event_name: "test1" }, { transaction: t });
await t.commit();
console.log("");
}, 10000);
} catch (error) {
console.log("", error);
}
等待 50 秒然后我的应用程序日志是这样的
DatabaseError [SequelizeDatabaseError]: Lock wait timeout exceeded; try restarting transaction
at Query.formatError (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/dialects/mysql/query.js:244:16)
at Execute.handler [as onResult] (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/dialects/mysql/query.js:51:23)
at Execute.execute (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/commands/command.js:30:14)
at Connection.handlePacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:417:32)
at PacketParser.onPacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:75:12)
at PacketParser.executeStart (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:82:25)
at Socket.emit (events.js:219:5)
at addChunk (_stream_readable.js:332:12)
at readableAddChunk (_stream_readable.js:307:11)
at Socket.Readable.push (_stream_readable.js:241:10)
at TCP.onStreamRead (internal/stream_base_commons.js:185:23)
From previous event:
at Query.run (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/dialects/mysql/query.js:39:12)
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/sequelize.js:645:29
From previous event:
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/sequelize.js:645:12
From previous event:
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/sequelize.js:641:10
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/retry-as-promised/index.js:70:21
at new Promise (<anonymous>)
at retryAsPromised (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/retry-as-promised/index.js:60:10)
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/sequelize.js:631:30
From previous event:
at Sequelize.query (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/sequelize.js:580:23)
at QueryInterface.update (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/query-interface.js:1012:27)
at /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/model.js:3985:52
at processImmediate (internal/timers.js:444:21)
From previous event:
at EventModel.save (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/model.js:3962:8)
at EventModel.update (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/sequelize/lib/model.js:4176:17)
at module.exports (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/src/databaseLoader/index.js:19:18)
at async /Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/server.js:78:5 {
name: 'SequelizeDatabaseError',
parent: Error: Lock wait timeout exceeded; try restarting transaction
at Packet.asError (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/packets/packet.js:712:17)
at Execute.execute (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/commands/command.js:28:26)
at Connection.handlePacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:417:32)
at PacketParser.onPacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:75:12)
at PacketParser.executeStart (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:82:25)
at Socket.emit (events.js:219:5)
at addChunk (_stream_readable.js:332:12)
at readableAddChunk (_stream_readable.js:307:11)
at Socket.Readable.push (_stream_readable.js:241:10)
at TCP.onStreamRead (internal/stream_base_commons.js:185:23) {
code: 'ER_LOCK_WAIT_TIMEOUT',
errno: 1205,
sqlState: 'HY000',
sqlMessage: 'Lock wait timeout exceeded; try restarting transaction',
sql: 'UPDATE `events` SET `event_name`=?,`updatedAt`=? WHERE `id` = ?',
parameters: [ 'test2', '2020-01-26 17:50:36', 1 ]
},
original: Error: Lock wait timeout exceeded; try restarting transaction
at Packet.asError (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/packets/packet.js:712:17)
at Execute.execute (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/commands/command.js:28:26)
at Connection.handlePacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:417:32)
at PacketParser.onPacket (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:75:12)
at PacketParser.executeStart (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/Users/akkarapongkhamtanet/Documents/MyWorks/joindi/back-end/node_modules/mysql2/lib/connection.js:82:25)
at Socket.emit (events.js:219:5)
at addChunk (_stream_readable.js:332:12)
at readableAddChunk (_stream_readable.js:307:11)
at Socket.Readable.push (_stream_readable.js:241:10)
at TCP.onStreamRead (internal/stream_base_commons.js:185:23) {
code: 'ER_LOCK_WAIT_TIMEOUT',
errno: 1205,
sqlState: 'HY000',
sqlMessage: 'Lock wait timeout exceeded; try restarting transaction',
sql: 'UPDATE `events` SET `event_name`=?,`updatedAt`=? WHERE `id` = ?',
parameters: [ 'test2', '2020-01-26 17:50:36', 1 ]
},
sql: 'UPDATE `events` SET `event_name`=?,`updatedAt`=? WHERE `id` = ?',
parameters: [ 'test2', '2020-01-26 17:50:36', 1 ]
}
打开交易时我想要锁定行。
我试图阅读文档(https://sequelize.org/master/class/lib/transaction.js~Transaction.html#static-get-LOCK)并且锁行不能使用锁。
帮帮我,请我阅读文件
解决方案
推荐阅读
- javascript - 如何将默认值设置为来自前缀或输入字段的状态
- mysql - 在 MySQL 工作台的 EER 图中,我在哪里设置外键约束名称?
- python - 给定 3d 张量时,argmax 如何工作 - tensorflow
- java - 有没有办法阻止在另一个 Android 应用程序中显示密码功能?
- javascript - 如果使用 jquery 在密码框中键入了某些内容,则显示和隐藏确认密码框
- r - 减小上标字体大小ggplot2 R
- django - 在网页上显示 Django 外键
- shiro - 我们可以使用 Apache Shiro 与 Angular 8
- dynamic-programming - 我无法理解 o(sum) 空间复杂度中硬币兑换问题的逻辑
- android - 如何在 kotlin 1.4 中使用视图绑定