sqlite是last_insert_rowid原子吗?

时间:2015-03-16 08:07:55

标签: node.js sqlite concurrency

我使用node.js sqlite3来操作数据。我使用这些代码将数据插入数据库并插入id:

db.run("INSERT INTO myTable (name) VALUES ('test')");
db.get("SELECT last_insert_rowid() as id", function (err, row) {
     console.log('Last inserted id is: ' + row['id']);
});

我认为这不稳定。我的数据库连接始终打开。当我的服务器在来自客户端的多个同时连接上提供此代码时,SELECT last_insert_rowid()是否正确获取ID? sqlite是last_insert_rowid原子吗? 感谢。

5 个答案:

答案 0 :(得分:8)

通过文档sqlite3 Database#run(sql, [param, ...], [callback]) 你可以从回调中追溯lastID

答案 1 :(得分:7)

try{

    db.run("INSERT INTO TABLE_NAME VALUES (NULL,?,?,?,?)",data1,data2,data3,data4,function(err){
                    if(err){
                        callback({"status":false,"val":err});
                    }else{
                        console.log("val  "+this.lastID);
                        callback({"status":true,"val":""});
                    }
                });
}catch(ex){
    callback({"status":false,"val":ex});
}

this.lastID返回最后插入的行标识By documentation sqlite3 Database#run(sql, [param, ...], [callback])

答案 2 :(得分:3)

对于Node.js Sqlite3最后插入的id你可以使用lastId

这是一个简单的例子

db.run("INSERT INTO foo ...", function(err) {
    if(null == err){
        // row inserted successfully
        console.log(this.lastID);
    } else {
        //Oops something went wrong
        console.log(err);
    }
});

答案 3 :(得分:1)

last_insert_rowid()返回此连接上最后一次插入操作的ROWID。

如果从同一数据库连接上的多个线程调用该函数,则结果是不可预测的。

文档(针对C API): https://www.sqlite.org/c3ref/last_insert_rowid.html

如果您不在多个线程之间共享数据库连接(会话)以进行并发插入,则这是安全的。如果在同一连接上插入多个线程,则这是不安全的,即您可能获得ID或完全无效的ID。

答案 4 :(得分:-1)

This.data.lastID将为您提供最后插入的ID。