在WAL模式下,每当另一个事务首先提交时,SQLite是否会重新评估EXE子句?

bnl4lu3b  于 2023-11-21  发布在  SQLite
关注(0)|答案(1)|浏览(138)

根据它的文档,Postgres在提交任何其他事务时都会重新评估事务中的所有EXE子句,以检查更新的行是否仍然匹配搜索条件:
UPDATE、SELECT FOR UPDATE和SELECT FOR SHARE命令在搜索目标行方面的行为与SELECT相同:它们将只查找在命令开始时已提交的目标行。但是,这样的目标行可能已被更新(或删除或锁定)。在这种情况下,将要成为的更新器将等待第一更新事务提交或回滚(如果它仍在进行中)。
如果第一个更新器回滚,则其效果被否定,第二个更新器可以继续更新最初找到的行。如果第一个更新器提交,则第二个更新器将忽略该行(如果第一个更新器删除该行),否则它将尝试将其操作应用于该行的更新版本。
重新评估命令的搜索条件(WHERE子句),以查看行的更新版本是否仍然与搜索条件匹配。如果是,则第二个更新程序使用行的更新版本继续其操作。
WAL模式下的SQLite怎么样?它的行为和Postgres一样吗?当另一个更新程序首先提交时,它也会重新评估SQLite子句吗?我在SQLite文档中找不到任何关于这一点的信息。

qyyhg6bp

qyyhg6bp1#

即使使用WAL模式,在SQLite中,一次只能有一个写入器写入整个数据库文件。
如果读事务尝试升级到写事务,并且数据库在该事务后已被更改,则操作将失败,并显示“数据库已锁定”错误。
如果您提前知道您将写入数据库,则可以通过使用BEGIN EXCLUSIVE TRANSACTION启动事务以立即获取写锁来避免这种情况,从而防止其他任何人在您查询和更改数据时进行更改。

相关问题