【发布时间】:2020-07-17 06:41:22
【问题描述】:
在向表中插入或更新行之前,我没有找到明确的 sqlite 锁定命令。 sqlite 是否自行处理锁定机制? http://sqlite.org/lockingv3.html 中描述的寻呼机模块处理锁定机制。但我不确定用户是否可以使用任何命令来显式锁定表。请指教。
谢谢
【问题讨论】:
在向表中插入或更新行之前,我没有找到明确的 sqlite 锁定命令。 sqlite 是否自行处理锁定机制? http://sqlite.org/lockingv3.html 中描述的寻呼机模块处理锁定机制。但我不确定用户是否可以使用任何命令来显式锁定表。请指教。
谢谢
【问题讨论】:
据我所知,没有专门的 sqlite 命令来控制锁定。但是,您可以让 sqlite 使用 create transaction 锁定数据库。例如:
BEGIN IMMEDIATE TRANSACTION;
...
COMMIT TRANSACTION;
BEGIN EXCLUSIVE TRANSACTION;
...
COMMIT TRANSACTION;
如果您阅读了我链接的文档,您应该会更好地了解 IMMEDIATE 和 EXCLUSIVE 事务之间的区别。
可能值得注意的是,sqlite 中的锁适用于整个数据库,而不仅仅是单个表,这与其他 sql 数据库中的 LOCK TABLE 语句不同。
【讨论】:
SQLite 会执行任何必要的锁定来实现您的 SQL 语句描述的事务方案。特别是,如果您不描述任何内容,那么您将获得自动提交行为,在每个语句的持续时间内持有一个锁,然后在语句完成时删除。如果您需要更长的事务(通常是真的!),那么您可以使用BEGIN TRANSACTION(通常缩写为BEGIN)明确要求它们,并以COMMIT TRANSACTION(或ROLLBACK TRANSACTION)结束。事务处理通常由您的语言接口为您包装(因为这使得正确处理变得相当容易,将事务生命周期与代码块或方法调用耦合)但在基础级别,它归结为BEGIN/@ 987654326@/ROLLBACK.
简而言之,您已经完成了交易。锁用于实现事务。您没有原始锁(这是一件好事;它们比您乍一看可能想的更难正确)。
【讨论】: