【问题标题】:SQLITE3 Lock Type for INSERT INTO SELECT WHERE Query用于 INSERT INTO SELECT WHERE 查询的 SQLITE3 锁定类型
【发布时间】:2015-09-08 22:51:49
【问题描述】:

简而言之:

这个查询会在 sqlite3 数据库上安装 EXCLUSIVE 锁吗?换句话说 - 是否存在竞争条件?

INSERT INTO reserves (size, owner_id) 
WITH cte as ( 
   SELECT sum(size) total_size FROM ( 
      SELECT size FROM files 
      UNION ALL 
      SELECT size FROM reserves 
   ) 
) 
SELECT 10, 'owner-id'
WHERE (select total_size from cte) < 20 OR(select total_size from cte) IS NULL 
;

详细说明:

我有两个缓存实体表 - 文件和空间储备。这两种实体类型都使用一些硬盘驱动器容量,此参数表示为size 列。此外,我可以使用的上述容量也有一些限制。同时从多个进程访问数据库,因此我必须以原子方式向数据库添加储备。

我正在使用http://cppcms.com/sql/cppdb/ 库,它不支持sqlite BEGIN EXCLUSIVE TRANSACTION; 命令,所以我在上面写了查询。它会按预期工作吗?

【问题讨论】:

    标签: database sqlite locking


    【解决方案1】:

    查询开始时,SQLite 将获得一个共享锁。
    它会在 INSERT 实际执行之前获得一个 RESERVED 锁。
    当它需要将更改写入磁盘时,它会获得一个独占锁,这通常是在事务结束时。

    请注意,SQLite 使用单个数据库范围的锁,因此所有写入都是原子的。

    【讨论】:

    • 那么,如果没有显式事务,就不可能在查询开始时将锁定升级为 EXCLUSIVE 吗?
    • 必须执行 BEGIN EXCLUSIVE。 PRAGMA locking_mode = EXCLUSIVE 可能太多了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多