此查询是否会在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;
命令,所以我在上面写了一个查询。它会按预期工作吗?
答案 0 :(得分:1)
SQLite将在查询开始时获得SHARED锁定 在INSERT实际执行之前,它将获得一个RESERVED锁 当需要将更改写入磁盘时,它将获得一个EXCLUSIVE锁定,这通常是在事务结束时。
请注意,SQLite使用单个数据库范围的锁,因此所有写操作都是原子的。