SQLite事务无法按预期工作

5 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";
?>
Run Code Online (Sandbox Code Playgroud)

而"2.php"是这样的.

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

print "ccc<br>";
$dbh->commit();
print "ddd";
?>
Run Code Online (Sandbox Code Playgroud)

我执行"1.php".它启动一个事务并等待55秒.

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

  1. "1.php"正在进行交易
  2. "1"包含数据库锁
  3. "2"无法开始交易
  4. "2"无法获得数据库锁定
  5. "2"必须等待55秒

但是,测试走了另一条道路.当我执行"2"时,那么

  1. "2"立即返回了它的结果
  2. "2"没等

所以我不得不认为"1"无法获得事务,或者无法获得数据库锁定.

有人可以帮忙吗?

Tom*_*lak 10

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

  • 一个.你制作它们EXCLUSIVE(它们是DEFERRED默认的),或者
  • 湾 你实际上访问数据库

所以要么你明确地打电话

$dbh->exec("BEGIN EXCLUSIVE TRANSACTION");
Run Code Online (Sandbox Code Playgroud)

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

引用文档(强调我的):

交易可以是延期交货,即时交易或独家交易.默认事务行为是延迟的. 延迟意味着在首次访问数据库之前,不会在数据库上获取锁.因此,对于延迟事务,BEGIN 语句本身不执行任何操作.在第一次读取或写入操作之前不会获取锁定.对数据库的第一次读取操作会创建一个SHARED锁定,第一次写入操作会创建一个RESERVED锁定.