SQLite事务无法按预期工作

时间:2009-02-19 07:37:43

标签: php sqlite pdo transactions

我准备了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. “1.php”正在进行交易和
  2. “1”拥有数据库锁
  3. “2”无法开始交易
  4. “2”无法获得数据库锁定
  5. “2”必须等待55秒
  6. 但是,测试走了另一条道路。当我执行“2”时,那么

    1. “2”立即返回结果
    2. “2”没有等待
    3. 所以我不得不认为“1”无法获得事务,或者无法获得数据库锁定。

      有人可以帮忙吗?

1 个答案:

答案 0 :(得分:9)

据我了解,除非

,否则SQLite事务不会锁定数据库
  • 一个。您制作了EXCLUSIVE(默认为DEFERRED)或
  • 湾您实际访问数据库

所以要么你明确地调用

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

或者在开始INSERT之前对数据库进行写操作(UPDATE / sleep())。

引用documentation(强调我的):

  

可以延迟交易,   立即或独家。 默认值   交易行为被推迟。   延迟意味着没有锁   在数据库上获得直到   首先访问数据库。 因此   延迟交易,BEGIN   声明本身什么都不做。锁定   直到第一次阅读才获得   或写操作。第一次阅读   对数据库的操作创建了一个   SHARED锁和第一次写   操作会创建一个RESERVED锁。