you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

node.jsでのMYSQLトランザクション処理実装例

今回の御題はasyncblock fiberで実装されたI/O処理同期化モジュール

コレを使ってSQL処理に特化したnode-seqに似たようなことをやってみた

前回の記事の3番の実装例っす

https://github.com/scriby/asyncblock

var q = new Query(mysqlconn);
    q
    .begin()
    .query('insert into hogehoge("a","b","c","e") values(0,1,2,3)')
    .query('insert into hogehoge("a","b","c","e") values(0,1,2,3)')
    .query('insert into hogehoge("a","b","c","e") values(0,1,2,3)')
    .query('insert into hogehoge("a","b","c","e") values(0,1,2,3)')
    .commit()
    .end({
        onSuccess : function(){
        },
        onError : function(e){
            console.log(e);
        },
        onLogging : function(q){
        },
    });

Queryの中身はSQLをキューでためてendでasyncblockの機能を使って非同期処理にフローを追加して同期的にコネクションにSQLを流すだけ。

↓Query.end()の実装

    var self = this;
    asyncblock(function(flow) {
        flow.errorCallback = function(e){//例外処理はここにくる
            self._q.clear();
            onError(e);
        };
        while(true){
            var q = self._q.dequeue();
            if(!q){
                break;
            }
            onLogging(query);
            self._mysqlConn.query(query, flow.add());
            var content = flow.wait();
            if(callback){
                callback(content);
            }
        }
        onSuccess();
    });

追記

↓似たようなモジュールが出てた

http://nodejsdb.org/