taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

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");
});