带有 journal_mode=WAL 的 go-sqlite3 给出 'database is locked' 错误
go-sqlite3 with journal_mode=WAL gives 'database is locked' error
在 go 中,我使用 mattn/go-sqlite3 模块打开了一个 sqlite3 数据库。我在使用 PRAGMA journal_mode=WAL.
打开后立即将数据库日志模式设置为 WAL
但是,如果我尝试从第二个进程打开数据库,而第一个进程是 运行,第二个进程无法打开它,而是收到 "database is locked" 错误。即使我没有执行任何交易,也会发生这种情况。
我使用的连接字符串是:
"file:mydbfile.db?cache=shared&mode=rwc"
(我打算回答我自己的问题,因为调试了很长时间)
如果你想启用journal_mode=WAL,你应该将它添加到连接字符串中:
"file:mydbfile.db?cache=shared&mode=rwc&_journal_mode=WAL"
作为打开数据库的一部分,go-sqlite3 将执行 PRAGMA 语句来设置各种默认值。这些默认设置之一是设置 journal_mode=DELETE。但是,如果另一个进程打开了数据库,则无法将模式更改回 DELETE。执行此语句失败并显示 "database is locked",因此您将看到打开操作失败并显示该错误。
连接字符串参数的完整列表列于https://github.com/mattn/go-sqlite3
在 go 中,我使用 mattn/go-sqlite3 模块打开了一个 sqlite3 数据库。我在使用 PRAGMA journal_mode=WAL.
打开后立即将数据库日志模式设置为 WAL但是,如果我尝试从第二个进程打开数据库,而第一个进程是 运行,第二个进程无法打开它,而是收到 "database is locked" 错误。即使我没有执行任何交易,也会发生这种情况。
我使用的连接字符串是:
"file:mydbfile.db?cache=shared&mode=rwc"
(我打算回答我自己的问题,因为调试了很长时间)
如果你想启用journal_mode=WAL,你应该将它添加到连接字符串中:
"file:mydbfile.db?cache=shared&mode=rwc&_journal_mode=WAL"
作为打开数据库的一部分,go-sqlite3 将执行 PRAGMA 语句来设置各种默认值。这些默认设置之一是设置 journal_mode=DELETE。但是,如果另一个进程打开了数据库,则无法将模式更改回 DELETE。执行此语句失败并显示 "database is locked",因此您将看到打开操作失败并显示该错误。
连接字符串参数的完整列表列于https://github.com/mattn/go-sqlite3