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 语句:数据库已锁定 [重复]