数据库锁住及 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)
注释掉,对比现象。
上一篇: SQLServer数据库基础知识点
下一篇: Python编程基础(类和对象的使用)
推荐阅读