5

我准备了 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 秒

但是,但测试进行了另一种方式。当我执行“2”时,然后

  1. "2" 立即返回结果
  2. “2”没等

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

任何人都可以帮忙吗?

4

1 回答 1

10

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

  • 一个。您制作它们EXCLUSIVEDEFERRED默认情况下它们是),或者
  • 湾。你实际上访问了数据库

所以要么你明确地打电话

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

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

引用文档(强调我的):

事务可以是延迟的、立即的或排他的。默认事务行为被延迟。 延迟意味着在第一次访问数据库之前不会在数据库上获取锁。因此,对于延迟事务,BEGIN 语句本身什么也不做。在第一次读取或写入操作之前不会获取锁。对数据库的第一个读操作创建一个共享锁,第一个写操作创建一个保留锁。

于 2009-02-19T08:01:23.307 回答