SQLite 事务没有按预期工作

Posted

技术标签:

【中文标题】SQLite 事务没有按预期工作【英文标题】:SQLite transaction doesn't work as expected 【发布时间】:2010-10-08 12:52:08 【问题描述】:

我准备了2个文件,“1.php”和“2.php”。

“1.php”是这样的。

<?php
$dbh = new PDO('sqlite:test1');
$dbh->beginTransaction();

print "aaa<br>";
sleep(55);
$dbh->commit();

print "bbb";
?>

而“2.php”是这样的。

<?php
$dbh = new PDO('sqlite:test1');
$dbh->beginTransaction();

print "ccc<br>";
$dbh->commit();
print "ddd";
?>

然后我执行“1.php”。它启动一个事务并等待 55 秒。

所以当我立即执行“2.php”时,我的期望是这样的:

    “1.php”正在获取交易和 “1”持有数据库锁 “2”无法开始事务 “2”无法获得数据库锁所以 “2”必须等待 55 秒

但是,但测试是另一种方式。当我执行“2”时,那么

    “2”立即返回结果 “2”没有等待

所以我不得不认为“1”无法获得事务,或者无法获得数据库锁。

谁能帮忙?

【问题讨论】:

【参考方案1】:

据我了解,SQLite 事务不会锁定数据库,除非

一个。你让他们EXCLUSIVE(默认情况下他们是DEFERRED),或者 乙。您实际访问数据库

所以要么你显式调用

$dbh->exec("BEGIN EXCLUSIVE TRANSACTION");

或者您在开始 sleep() 之前对 DB 进行写入操作 (INSERT/UPDATE)。

引用documentation(强调我的):

交易可以延期, 直接的或排他的。 默认 交易行为被延迟。 延迟意味着没有锁 在数据库中获取直到 首先访问数据库。 因此与 延期交易,BEGIN 语句本身什么都不做。 锁 直到第一次读取才获得 或写操作。第一次读 针对数据库的操作会创建一个 共享锁和第一次写入 操作创建一个保留锁。

【讨论】:

以上是关于SQLite 事务没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

无法在 SQLite DB 上执行 UPDATE 语句:数据库已锁定 [重复]

Android Lollipop - 改变 SQLite 的行为

尝试在SQLite3中创建具有多个条件的SQL VIEW

SQLIte Transaction

python使用上下文管理器实现sqlite3事务机制

不同数据库后端的peewee数据库的运行时初始化