我准备了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"时,我的期望是这样的:
但是,测试走了另一条道路.当我执行"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锁定.