[解決済み】PHP + MySQL トランザクションの例
2022-03-29 14:07:11
質問
MySQLのトランザクションが使用されているPHPファイルの正常な例を、私は本当に見つけられませんでした。その簡単な例を示してもらえますか?
そしてもう一つ質問です。私はすでに多くのプログラミングを行いましたが、トランザクションは使いませんでした。PHPの関数か何かを
header.php
もし、ある
mysql_query
失敗したら、他も失敗するのか?
わかったような気がするのですが、正しいのでしょうか?
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
}
解決方法は?
私がトランザクションを扱うときに一般的に使っている考え方は、次のようなものです。 (半擬似コード) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
この考え方では、クエリに失敗した場合、Exceptionを投げなければならないことに注意してください。
-
PDOは、設定次第でそれが可能です。
-
参照
PDO::setAttribute
-
と
PDO::ATTR_ERRMODE
とPDO::ERRMODE_EXCEPTION
-
参照
- 他のAPIでは、クエリを実行するために使用した関数の結果をテストして、自分で例外を投げなければならないかもしれません。
残念ながら、魔法は使えません。どこかに指示を出せば、自動的にトランザクションが実行されるわけではありません。トランザクションで実行しなければならないクエリー群を特定しなければならないのです。
例えば、トランザクションの前にいくつかのクエリーを用意することがよくあります。
(の前)。
begin
)
と、トランザクションの後にもう2つほどクエリを実行します。
(どちらかの後に
commit
または
rollback
)
そして、これらのクエリは何が起きても実行されるようにします。
(あるいは)
トランザクションの中で
関連
-
[解決済み】 $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて]
-
[解決済み] SSLエラー SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました。
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】stdClassクラスのオブジェクトが文字列に変換されない。
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】phpMyAdmin: シークレットパスフレーズ?
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
MacでPHPを実行した際に、メモリサイズが134217728バイトも消費される問題の解決方法について
-
[解決済み】In_arrayが動作しない。
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。
-
[解決済み】警告: file_get_contents(): https:// ラッパーがサーバー構成ですべて無効になっています。
-
[解決済み] libapache2-mod-php7 パッケージの場所がわからない