首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INSERT INTO SELECT WHERE查询的SQLITE3锁类型

INSERT INTO SELECT WHERE查询的SQLITE3锁类型
EN

Stack Overflow用户
提问于 2015-09-08 21:44:14
回答 1查看 251关注 0票数 0

简而言之:

此查询是否会在sqlite3数据库上安装排它锁?换句话说--是否存在竞争条件?

代码语言:javascript
复制
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;命令,所以我写了上面的查询。它会按预期工作吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-08 22:51:49

当查询开始时,SQLite将获得一个共享锁。

它将在INSERT实际执行之前获得一个保留锁。

当它需要将更改写入磁盘时,它将获得排它锁,这通常是在事务结束时。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32459472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档