トランザクションは、データベース操作にPHPのPDO(PHPデータオブジェクト)を使用する際にデータの一貫性と整合性を確保するための重要なメカニズムの1つです。 PDO :: beginTransaction()は、トランザクションを開始する一般的な方法です。多くの開発者は、彼らがいつ初心者であるかを疑問に思うでしょう。この記事では、2つの深さの接続を詳細に調べ、例を通じて詳細に分析します。
ほとんどのデータベース(MySQLなど)では、デフォルトでは、独立して実行された各SQLステートメントが独立したトランザクションとして実行され、自動的にコミットされます。この動作はAutoCommitと呼ばれます。言い換えれば、不明確にトランザクションを開始すると、データベースは、挿入、更新、または削除ステートメントを実行した後、すぐに操作の結果を保存します。
PDO :: beginTransaction()を呼び出すと、PDOは現在の自動コミットモードを自動的にオフにし、新しいトランザクションを開始します。現時点では、データベースへの後続のすべての書き込み操作(挿入、更新、削除など)は、PDO :: commit()またはpdo :: rollback()を明示的に呼び出すまですぐに送信されません。言い換えれば、この関数の関数は、「自動提出をオフにし、手動提出を有効にする」ことです。
自動提出パターンとのコア関係は次のとおりです。
begintransaction()が呼び出されない場合:各ステートメントが実行された直後に送信します(自動送信モードが有効になります)。
begintransaction()を呼び出した後:自動送信モードをオフにし、トランザクションコントロール状態を入力します。
トランザクションが実行された後( commit()またはrollback() )、PDOは通常、自動コミットモードへの接続を自動的に復元し、後続のステートメントがデフォルトの動作として実行され続けることができることに注意してください。
<?php
try {
$pdo = new PDO("mysql:host=localhost;dbname=testdb", "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// トランザクションを開始します,自動提出が閉じられています
$pdo->beginTransaction();
// 最初のレコードを挿入します
$pdo->exec("INSERT INTO users (name, email) VALUES ('Alice', '[email protected]')");
// 2番目のレコードを挿入します
$pdo->exec("INSERT INTO users (name, email) VALUES ('Bob', '[email protected]')");
// トランザクションを送信します
$pdo->commit();
echo "データは正常に記述されています。";
} catch (Exception $e) {
$pdo->rollBack(); // 例外がある場合,ロールバックトランザクション
echo "トランザクションは失敗しました:" . $e->getMessage();
}
?>
上記のコードでは、挿入されたレコードは、commit()が正常に呼び出された後にのみ、実際にデータベースに書き込まれます。例外が途中で発生した場合、 rollback()を呼び出すことはすべて、コミットされていないすべての変更を元に戻します。プロセス全体は、自動送信モードがオフになったときに発生します。
SQLステートメントを使用して、自動提出パターンの変更を観察できます。
$pdo->query("SELECT @@autocommit")->fetchColumn(); // 戻る 1 を示します,0 近いことを示します
beginTransaction()を実行した後、クエリを実行すると0が返され、自動提出が閉じられていることが示されます。この状態は、トランザクションが終了するまで続きます。
一部のドライバーでは、 PDO :: setAttribute()を使用して自動コミット状態を設定できます。たとえば、:
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
しかし、これは2つの理由で推奨されません。
すべてのPDOドライバーがこのプロパティをサポートするわけではなく、不適切な使用が互換性の問題を引き起こす可能性があります。
標準のトランザクションAPI(つまり、 begintransaction() 、 compd() 、 rollback( )を使用してトランザクション状態を管理して、クロスプラットフォームの一貫性を確保することをお勧めします。
PDO :: beginTransaction()の機能は、自動コミットモードをオフにし、トランザクションを手動で管理することです。
トランザクションが使用されない場合、デフォルトでは自動コミットモードが有効になります。
compit()またはrollback()が呼び出されると、トランザクションが終了し、自動コミットが再開されます。
トランザクションを使用すると、特に複数の書き込み操作が「すべて成功またはすべて失敗」しなければならないシナリオでは、データ操作のセキュリティと一貫性を改善できます。
begintransaction()と自動送信の関係を理解すると、より堅牢で制御可能なデータベース操作コードを作成するのに役立ちます。トランザクションはパフォーマンスの敵ではなく、データの正しさの守護聖人であることを忘れないでください。