用于INSERT INTO SELECT WHERE查询的SQLITE3锁类型

时间:2015-09-08 13:44:14

标签: database sqlite locking

简而言之:

此查询是否会在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;命令,所以我在上面写了一个查询。它会按预期工作吗?

1 个答案:

答案 0 :(得分:1)

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

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