数据库锁住及 lua 处理方式

数据库锁住

因为MQTT项目中的数据都是保存在数据中,因此就需要对数据库进行大量的写入操作。这就出现了一个问题:

当多个线程或进程对数据进行写操作时,那么就会造成操作失败。因为,数据库进行写操作时,会加上一个锁,防止别的操作进行修改。一般会返回一个错误码为5.

通过网上的查询,解决方式很多,最简单的就是用while循环,当返回值是0,才退出。

当然也有其他的处理方式:

1.使用信号量,或PV锁等一些锁的机制

2.使用数据库提供的busy_handler 和 busy_timeout 函数。
具体怎么实现的,网上关于C的代码,一般都有。但是lua的例子较少。所以,在这里我就贴上我的demo,供大家参考:

demo1.lua
local sqlite3 = require("lsqlite3")
local socket = require("socket.core")
local db = sqlite3.open("./test.db")
db:exec("CREATE TABLE apcfg(sn text,data text)")
function callback(...)
    print("callback")
    socket.select(nil,nil,0.01)
    return 1
end

db:busy_handler(callback,1)

while(true) do
    print(db:exec("insert INTO apcfg (sn,data) VALUES ('123','456');"))
 --   print(db:exec("select * from apcfg;"))
    print("-----")

end

demo2.lua

local sqlite3 = require("lsqlite3")                                
local socket = require("socket.core")                              
local db = sqlite3.open("./test.db")                               
db:exec("CREATE TABLE apcfg(sn text,data text)")                   
function callback(...)                                             
    print("callback")                                              
    socket.select(nil,nil,0.01)                                    
    return 1                                                       
end                                                                

db:busy_handler(callback,1)                                        

while(true) do                                                     
    print(db:exec("delete from apcfg where sn = '123'"))           
    --socket.select(nil,nil,0.1)                                   
    print("--------")                                              
end                                      

我使用的是sqlite库提供的api。亲测是可以的。有兴趣的朋友,可以尝试将

db:busy_handler(callback,1)

注释掉,对比现象。

你可能感兴趣的:(lua学习)