2017-10-01 5 views
1

私は、それぞれが「テスト」と呼ばれるテーブルを含む、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つの接続を使用していますが。

答えて

1

あなたがにリンクされている質問を誤解しています。

あなたは確かに限り、データベースはMySQLサーバの同じインスタンスにホストされているように、複数のデータベース内のテーブルを参照する取引を行うことができます。 qualified table namesを使用すると、1つのステートメントで複数のデータベースを参照することもできます。

あなたがリンクしている質問は、でホストされているデータベースについてです。異なるホスト上のMySQL Serverインスタンス。 PDOは、複数のMySQLサーバに対するコミットの調整をサポートしていません。あなたのコメントを再


はい、トランザクションは単一の接続にスコープされ、接続が単一のMySQL Serverインスタンスに行われています。複数のMySQL接続にまたがるトランザクションを作成することはできません。

しかし、一つのMySQL Serverインスタンスへの1つの接続中に、あなたは複数のデータベースを参照することができます。

複数のサーバーにまたがる分散トランザクションの概念は、MySQLによってサポートされています。これはXA Transactionと呼ばれています。 PDOは、XAトランザクションを直接サポートしていません。

ほとんどのアプリケーションでは、一度に1つのMySQLインスタンスだけで動作するため、XAトランザクションは必要ありません。

+0

をご覧ください。私が見つけた他の質問の文言は、「トランザクションは単一のデータベース内で分離されている」と述べています。トランザクションは単一のデータベース接続とサーバー内で分離されていると言う方が正しいでしょうか? – morbidCode

+0

これは他のDBMにも共通ですが、mysqlのためだけですか? – morbidCode

+0

私は他のすべてのDBMSを検証していませんが、これは私の経験では一般的です。 –

関連する問題