我准备了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”时,我的期望是:
但是,测试走了另一条道路。当我执行“2”时,那么
所以我不得不认为“1”无法获得事务,或者无法获得数据库锁定。
有人可以帮忙吗?
答案 0 :(得分:9)
据我了解,除非
,否则SQLite事务不会锁定数据库EXCLUSIVE
(默认为DEFERRED
)或所以要么你明确地调用
$dbh->exec("BEGIN EXCLUSIVE TRANSACTION");
或者在开始INSERT
之前对数据库进行写操作(UPDATE
/ sleep()
)。
引用documentation(强调我的):
可以延迟交易, 立即或独家。 默认值 交易行为被推迟。 延迟意味着没有锁 在数据库上获得直到 首先访问数据库。 因此 延迟交易,
BEGIN
声明本身什么都不做。锁定 直到第一次阅读才获得 或写操作。第一次阅读 对数据库的操作创建了一个 SHARED锁和第一次写 操作会创建一个RESERVED锁。