【问题标题】:How are transactions partitioned/isolated in SQLite?SQLite 中的事务是如何分区/隔离的?
【发布时间】:2016-12-16 22:46:33
【问题描述】:

我一直在阅读 SQLite 文档并参考了我之前编写的代码,但我似乎无法为我想象的一个相当简单的问题找到明确的答案。

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

所以,我的问题是,

1) .. 在事务周围使用某种信号量通常会更好,以确保它们不会与针对数据库句柄执行的其他语句发生冲突/收集。我已经编组写入以防止 SQLite 出现多线程问题(尽管现在使用 WAL 很难解决它)。

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

【问题讨论】:

  • 啊抱歉,我也不能,因为它已被标记为重复。现在会这样做。谢谢。

标签: sql sqlite


【解决方案1】:

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

因此,向数据库打开多个连接的混合方法似乎提供了足够的并发保证,在打开新连接的费用与允许多线程写入事务的好处之间进行权衡。

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

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

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

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


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

【讨论】:

    猜你喜欢
    • 2015-06-14
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多