3

アプリケーションでnode-mysqlを使用しています。SELECT FOR UPDATEを実装しようとしましたが、正しく動作させることができませんでした。私が抱えている問題は、以下のコードのように見えます。以下の for ループの最初のトランザクションは、2 番目のトランザクションを正常にブロックしません。代わりに、両方のトランザクションが同時に SELECT FOR UPDATE を実行し、同じレコードを取得します。どうすればこれを修正できますか? ありがとう!

var testTransaction = function (count) {
  connection.beginTransaction(function(err) {
    if (err) throw err;
    db.query('SELECT * FROM myTable WHERE id = 1 FOR UPDATE', function(err, rows, result) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
      }
      connection.query('UPDATE myTable SET myField=? WHERE id=1', (count + 1), function(err, result) {
        if (err) { 
          db.rollback(function() {
            throw err;
          });
        }  
        connection.commit(function(err) {
          if (err) { 
            db.rollback(function() {
              throw err;
            });
          }
          console.log('success!');
        });
      });

    }); 

  });
}

for (var i = 0; i < 2; i++) {
  testTransaction(i);
}
4

2 に答える 2

0

node-mysqlモジュールのメソッドは非同期に記述されているため、アプリケーションをブロックしません。ループを使用する理由がほとんどない場合は、関数にコールバックを追加して実行をネストするだけです。

var testTransaction = function(count, callback) {
  connection.beginTransaction(function (err) {
    if (err) throw err;
    db.query('SELECT * FROM myTable WHERE id = 1 FOR UPDATE', function (err, rows, result) {
      if (err) {
        connection.rollback(function() {
          return callback(err);
        });
      }
      connection.query('UPDATE myTable SET myField=? WHERE id=1', (count + 1), function (err, result) {
        if (err) {
          db.rollback(function() {
            return callback(err);
          });
        }
        connection.commit(function (err) {
          if (err) {
            db.rollback(function() {
              return callback(err);
            });
          }
          callback(null);
          console.log('success!');
        });
      });
    });
  });
};

testTransaction(0, function(err) {
  testTransaction(1, function(err) {
    // both operations have completed
  });
});

何らかの理由で非同期関数をループする必要がある場合は、非同期ライブラリを調べます。

于 2013-10-10T02:54:50.347 に答える