我准备了2个文件,"1.php"和"2.php".
"1.php"是这样的.
beginTransaction(); print "aaa
"; sleep(55); $dbh->commit(); print "bbb"; ?>
而"2.php"是这样的.
beginTransaction(); print "ccc
"; $dbh->commit(); print "ddd"; ?>
我执行"1.php".它启动一个事务并等待55秒.
所以,当我立即执行"2.php"时,我的期望是这样的:
"1.php"正在进行交易
"1"包含数据库锁
"2"无法开始交易
"2"无法获得数据库锁定
"2"必须等待55秒
但是,测试走了另一条道路.当我执行"2"时,那么
"2"立即返回了它的结果
"2"没等
所以我不得不认为"1"无法获得事务,或者无法获得数据库锁定.
有人可以帮忙吗?
据我了解,SQLite事务不会锁定数据库,除非
一个.你制作它们EXCLUSIVE
(它们是DEFERRED
默认的),或者
湾 你实际上访问数据库
所以要么你明确地打电话
$dbh->exec("BEGIN EXCLUSIVE TRANSACTION");
或者在开始之前对DB 进行写操作(INSERT
/ UPDATE
)sleep()
.
引用文档(强调我的):
交易可以是延期交货,即时交易或独家交易.默认事务行为是延迟的. 延迟意味着在首次访问数据库之前,不会在数据库上获取锁.因此,对于延迟事务,
BEGIN
语句本身不执行任何操作.在第一次读取或写入操作之前不会获取锁定.对数据库的第一次读取操作会创建一个SHARED锁定,第一次写入操作会创建一个RESERVED锁定.