У меня есть 2 пользователя, которые одновременно испускают функцию create_todo. 'create_todo' имеет несколько mysql запросов, которые теперь перекрываются. Есть ли способ предотвратить это асинхронное c поведение, чтобы функция createTodo () дождалась завершения всех запросов.
Я использую nodejs с socket.io 2.3.0
Пример кода
// server
socket.on('create_todo', function(payload) {
createTodo(name, status, titleId, userId);
});
async function createTodo(name, status, titleId, userId) {
const db = makeDb();
try {
await db.beginTransaction();
console.log('start transaction userId: ', userId);
const res = await db.query(
'INSERT INTO todo_items (name, status, todo_title_id, modifier) VALUES (?,?,?,?)',
[name, status, titleId, userId]);
console.log('phase 1 ');
await db.query(
'UPDATE todo_items SET order_number = (SELECT c FROM (SELECT COUNT(*) AS c FROM
todo_items WHERE todo_title_id = ? AND id <= ?) t) WHERE todo_items.id = ?',
[titleId, res.insertId, res.insertId]);
console.log('phase 2 ');
const rows = await db.query(
'SELECT todo_items.id, todo_items.name, todo_items.status, todo_items.order_number,
users.username FROM todo_items INNER JOIN users ON todo_items.modifier = users.id
WHERE todo_title_id = ? AND todo_items.id = ?',
[titleId, res.insertId]);
console.log('phase 3');
await db.commit();
console.log('commit');
todoItems.to('title/' + titleId).emit('create_todo', {
id: rows[0].id,
name: rows[0].name,
status: rows[0].status,
modifier: rows[0].username,
orderNumber: rows[0].order_number
});
} catch (e) {
await db.rollback();
} finally {
await db.close();
console.log('db close');
}
}
Текущее поведение
start transaction userId: 1
start transaction userId: 2
phase 1
phase 1
phase 2
phase 3
commit
db close
phase 2
phase 3
commit
db close
Ожидаемое поведение
start transaction userId: 1
phase 1
phase 2
phase 3
commit
db close
start transaction userId: 2
phase 1
phase 2
phase 3
commit
db close
Также я пробовал использовать цепочку обещаний.