为什么通过lua脚本访问数据库会删除-WAL文件?

我有一个关于SQLite和Lua的问题。基本上,我正在尝试在我的Android应用程序中使用WAL模式的SQLite。然而,如果我使用Lua脚本从数据库执行特定的操作,它将删除“-wal”文件。这会导致问题:如果设备失电,我的一些交易可能会丢失,我没有机会正确关闭DB连接。流程如下图所示。 流程图

这是我打开数据库的方式(c ++): int32 rcOpen = sqlite3_open(filename.c_str(), &handle);

此外,在连接打开后,我使用这些“pragma”

PRAGMA journal_mode=WAL;
PRAGMA synchronous=FULL;
  • 也尝试过 PRAGMA synchronous=EXTRA + PRAGMA locking_mode=EXCLUSIVE - 没有任何区别
  • 还尝试使用文件控制模式SQLITE_FCNTL_PERSIST_WAL - 结果也没有任何区别
int enabled = 1;
int rcControl = sqlite3_file_control(handle, "main", SQLITE_FCNTL_PERSIST_WAL, &enabled);

堆栈:android 7(fs ext4) - JNI(NDK 21.4.7075529)- c ++ 11 - sqlite 3.27.2 - lua 5.3.4

我用于重现问题的lua脚本:

function prequire(name)
    local status, lib = pcall(require, name)
    if(status) then return lib end
    --Library failed to load
    return nil
end

print("start lua")

local sqlite3 = prequire("lsqlite3complete")
if sqlite3 == nil then
    print('No lsqlite3')
    return
end

local db = sqlite3.open('/data/data/ru.chromesearcher.sqlitewal/files/database.sqlite3')
if db == nil then
    print("db open failed")
    return
end

print("query start")

local stmt = db:prepare('SELECT * FROM paymentevents where pe_amount=?')
local amount = 3000
stmt:bind_values(amount)
stmt:finalize()

db:close()

原文链接 https://stackoverflow.com/questions/68994002

点赞