node.jsでのクイックハック
jquery-deferredを使ったなんちゃってトランザクション。
まだnode-mysqlでの使用しか想定してないので。
var $ = require('jquery-deferred'); function transaction(conn, callback) { var d = $.Deferred(); d.done(function() { conn.query('COMMIT'); }).fail(function() { conn.query('ROLLBACK'); }); conn.query('START TRANSACTION', function() { callback.apply({ rollback: function() { d.reject.apply(d, arguments); }, commit : function() { d.resolve.apply(d, arguments); } }); }); return d.promise(); } exports.transaction = transaction;
こんな感じでコードを書く
util.transaction(conn, function() { try { conn.query(SOME_SQL, function(err, results) { if (err) throw new Error; }); this.commit(); } catch(e) { this.rollback(); } }).done(function() { console.log("transaction success"); }).fail(function() { console.log("transaction fail"); });