【问题标题】:Sqlite transactions in nodejsnodejs中的Sqlite事务
【发布时间】:2017-01-17 23:21:25
【问题描述】:

根据 nodejs sqlite 库 (https://github.com/mapbox/node-sqlite3),您可以使用 db.serialize 函数序列化 sql 事务。此函数中的所有执行都将按照指定的顺序执行。 但是使用 for 循环如何获取有关事务的信息是成功还是失败?

function transaction(callback) {
    db.serialize(function() {
        db.run("BEGIN");

        for(...) {
            db.run("INSERT", function(err) {
                //this code is not serialized with the parent serialize function (this is my problem)
                //if one run throw error i must resolve the callback with the error code

                if (err)
                    callback("error");
            });
        }

        db.run("END");

        callback("ok");
    }
}

【问题讨论】:

    标签: node.js sqlite for-loop transactions


    【解决方案1】:

    在开始交易之前,您可以定义一些变量,例如var results = [];。在回调中完成每个查询后,您可以将错误或 null 收集为results.push(err) 并检查results.length。当results.length 等于for 的长度时,所有查询都会执行,现在检查results.every((i) => i === null) 的值。如果为真,则执行commit,否则执行rollback


    更好地控制流程是使用异步模块。

    'use strict'
    var async = require('async');
    ...
    db.run('begin', function(err){
        if (err)
            return console.log(err);
    
        let run = (sql, callback) => db.run(sql, callback);    
        async.eachSeries(sqls, run, function(err){
            db.run((err) ? 'rollback' : 'commit', ...)
        })
    })
    

    如果将begin添加到sqls中,那么代码会更简单。

    【讨论】:

    • 谢谢 :) 您的解决方案的问题是,对于单个连接,只有一个线程可以调用该函数,否则会发生“事务错误事务”。
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2018-05-14
    相关资源
    最近更新 更多