Socket io предотвращает одновременные mysql запросы - PullRequest
0 голосов
/ 04 августа 2020

У меня есть 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

Также я пробовал использовать цепочку обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...