【问题标题】:Explicit locking mechanism in SQLiteSQLite 中的显式锁定机制
【发布时间】:2020-07-17 06:41:22
【问题描述】:

在向表中插入或更新行之前,我没有找到明确的 sqlite 锁定命令。 sqlite 是否自行处理锁定机制? http://sqlite.org/lockingv3.html 中描述的寻呼机模块处理锁定机制。但我不确定用户是否可以使用任何命令来显式锁定表。请指教。

谢谢

【问题讨论】:

    标签: database sqlite


    【解决方案1】:

    据我所知,没有专门的 sqlite 命令来控制锁定。但是,您可以让 sqlite 使用 create transaction 锁定数据库。例如:

    BEGIN IMMEDIATE TRANSACTION;
    ...
    COMMIT TRANSACTION;
    
    BEGIN EXCLUSIVE TRANSACTION;
    ...
    COMMIT TRANSACTION;
    

    如果您阅读了我链接的文档,您应该会更好地了解 IMMEDIATEEXCLUSIVE 事务之间的区别。

    可能值得注意的是,sqlite 中的锁适用于整个数据库,而不仅仅是单个表,这与其他 sql 数据库中的 LOCK TABLE 语句不同。

    【讨论】:

      【解决方案2】:

      SQLite 会执行任何必要的锁定来实现您的 SQL 语句描述的事务方案。特别是,如果您不描述任何内容,那么您将获得自动提交行为,在每个语句的持续时间内持有一个锁,然后在语句完成时删除。如果您需要更长的事务(通常是真的!),那么您可以使用BEGIN TRANSACTION(通常缩写为BEGIN)明确要求它们,并以COMMIT TRANSACTION(或ROLLBACK TRANSACTION)结束。事务处理通常由您的语言接口为您包装(因为这使得正确处理变得相当容易,将事务生命周期与代码块或方法调用耦合)但在基础级别,它归结为BEGIN/@ 987654326@/ROLLBACK.

      简而言之,您已经完成了交易。锁用于实现事务。您没有原始锁(这是一件好事;它们比您乍一看可能想的更难正确)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2021-03-14
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多