5

「1.php」と「2.php」の2つのファイルを用意しました。

「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デフォルトではそうです)、または
  • b. あなたは実際にデータベースにアクセスします

したがって、明示的に呼び出すか

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

または、開始する前に DB への書き込み操作 ( INSERT/ ) を行います。UPDATEsleep()

ドキュメントを引用するには(強調は私のものです):

トランザクションは、遅延、即時、または排他的である可能性があります。デフォルトのトランザクション動作は据え置きです。 Deferred は、データベースが最初にアクセスされるまで、データベースでロックが取得されないことを意味します。したがって、遅延トランザクションでは、BEGIN ステートメント自体は何もしません。ロックは、最初の読み取りまたは書き込み操作まで取得されません。データベースに対する最初の読み取り操作では SHARED ロックが作成され、最初の書き込み操作では RESERVED ロックが作成されます。

于 2009-02-19T08:01:23.307 に答える