私は、それぞれが「テスト」と呼ばれるテーブルを含む、mysqlの上で2つのデータベースを作成しました。複数のデータベース内のトランザクションに関する混乱
create table db1.test(
test_id int primary key auto_increment,
value int(5) not null);
create table db2.test(
test_id int primary key auto_increment,
value int(5) not null);
PDO transaction across multiple databases, is it possible?によると、PDOは、複数のデータベース内のトランザクションをサポートしていませんが、私は私のテストの結果によって驚いています。ここに私のコードです。
$con = new PDO("mysql:host=localhost", "root", "", array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
try {
$con->beginTransaction();
$con->exec("use db1");
$stmt = $con->prepare("insert into test (value) values(?)");
$stmt->execute([1]);
$con->exec("use db2");
$stmt = $con->prepare("insert into test (value) values(?)");
$stmt->execute([1]);
$con->commit();
} catch (Exception $e) {
$con->rollback();
echo $e->getMessage();
}
コードは問題なく挿入されました。私が2つのデータベースを使用しているので、私が始めたトランザクションがうまくいかないことをテストするために、私はdb2.testを削除し、db1.testの挿入が成功すると期待しています。 db2.testの挿入は失敗しましたが、db1.testもコミットしませんでした。
私は混乱しています。 2つのデータベースを使用しているときにPDOがトランザクションを実行するのはなぜですか?また
、この質問への答え: Multiple database and transactions
スクワットを行うことはありません。トランザクションは単一の 「データベース」内で分離されています。トランザクションを複数の データベースにまたがるようにするには、「分散トランザクション 管理」が必要です。
この質問のコードは2つの接続を使用していますが。
をご覧ください。私が見つけた他の質問の文言は、「トランザクションは単一のデータベース内で分離されている」と述べています。トランザクションは単一のデータベース接続とサーバー内で分離されていると言う方が正しいでしょうか? – morbidCode
これは他のDBMにも共通ですが、mysqlのためだけですか? – morbidCode
私は他のすべてのDBMSを検証していませんが、これは私の経験では一般的です。 –