0

node-mysql でトランザクションを実行したい (クエリ START TRANSACTION、ROLLBACK、COMMIT を実行して)。私はこのコードを持っています:

conn.query("START TRANSACTION");
conn.query("INSERT INTO users (id, name, age) VALUES (1, 'Mat', '24')", function(e){
    if (e){
        conn.query("ROLLBACK", callback);
    }
    else{
        conn.query("COMMIT", callback);
    }
});

conn.query("INSERT INTO users (name, age) VALUES ('Mat', '24')", function(e, r){
    console.log(e); // null
    console.log(r); // {fieldCount: 0, affectedRows: 1, insertId: 2, serverStatus: 3, warningCount: 0, message: ''}
});

ロールバック ケースをテストするために、意図的に id を 1 に設定しました。これにより、インデックスの重複エラーが発生します。トランザクションはロールバックされますが、問題は、トランザクションの外部にある 2 番目の挿入が実行されないことです。エラーはログに記録されません。奇妙なことに、2 回目の挿入の直後にテーブル全体を選択すると、結果に新しい行が表示されます。しかし、別の接続では、それは消えます。そのため、接続の最後に新しく作成された行が削除されたように見えます。トランザクションがコミットされている場合、問題は発生しません。

4

1 に答える 1

1

2 番目のコールバックは、コールバックの外部で実行されるため、最初のコールバックINSERT INTOより前に実行できます。その場合、単一の接続を使用しているため、2 番目の挿入もロールバックされます。最初のコールバック内に 2 番目の挿入を移動して、物事をシリアル化します。ROLLBACKINSERT INTO

于 2012-07-16T23:09:09.877 に答える