如何在SQLite中分区/隔离事务?

时间:2016-12-14 15:25:37

标签: sql sqlite

我一直在阅读SQLite文档,并且还引用了我之前编写过的代码,但我似乎无法找到对我想象的一个明确答案的明确答案。

我想在事务中执行许多(单独的)编译语句,但子线程也可能同时创建事务或只执行语句,我不希望它们包含在此特定事务中。目前,我有一个数据库句柄,我在所有线程之间共享。

所以,我的问题是,

1)..通常最好在事务周围使用某种信号量,以确保它们不会与针对数据库句柄执行的其他语句发生冲突/收集。我已经编写了一些文章,以防止SQLite存在多线程问题(尽管现在使用WAL很难让它完全不受影响)。

2)..或者你是否希望打开多个数据库连接,并且如果它们是并发的,则每个数据库连接启动/提交一个事务?

1 个答案:

答案 0 :(得分:0)

在提交之前,对一个数据库连接所做的更改对于所有其他数据库连接是不可见的。

因此,似乎是一种向数据库开放多个连接的混合方法提供了足够的并发保证,以牺牲打开新连接为代价,并允许多线程写入事务。

查询会查看在查询开始之前在同一数据库连接上完成的所有更改,无论这些更改是否已提交。

如果在查询开始运行之后但在查询完成之前在同一数据库连接上发生更改,则查询是否会看到这些更改是不确定的。

如果在查询开始运行之后但在查询完成之前在同一数据库连接上发生更改,则查询可能会多次返回已更改的行,或者它可能会返回先前已删除的行。

出于前四个项目的目的,使用相同共享缓存并启用PRAGMA read_uncommitted的两个数据库连接被视为相同的数据库连接,而不是单独的数据库连接。

这是SQLite information on isolation。这对于解决和理解这个问题非常有用。