欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库锁住及 lua 处理方式

程序员文章站 2022-03-03 20:00:13
...

数据库锁住

因为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 数据库