简而言之:
此查询是否会在sqlite3数据库上安装排它锁?换句话说--是否存在竞争条件?
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;命令,所以我写了上面的查询。它会按预期工作吗?
发布于 2015-09-08 22:51:49
当查询开始时,SQLite将获得一个共享锁。
它将在INSERT实际执行之前获得一个保留锁。
当它需要将更改写入磁盘时,它将获得排它锁,这通常是在事务结束时。
请注意,SQLite使用单个数据库范围的锁,因此所有写入都是原子的。
https://stackoverflow.com/questions/32459472
复制相似问题