MySQL トランザクションを使用しているときに、commit
2 回使用すると問題はありますか? 例えば
START TRANSACTION
/* Various DB UPDATEs */
COMMIT
COMMIT
それをテストしたところ、2 番目の COMMIT は NO OP であり、同様に である可能性があるようROLLBACK
です。それは正しいですか? それは無害ですか、それとも問題になる可能性がありますか?
私が理解しているように、最初のコミットの後、自動コミットが有効になるため、2番目のコミットは無意味です...しかし、害はありますか?
背景情報:
PHP を使用しており、データベース トランザクションがあります。
$dbconnection->getPdoInstance()->beginTransaction();
/* ... Various DB UPDATEs */
$dbconnection->getPdoInstance()->commit();
ただし、コミットにMYSQL COMMENTを配置して、 で表示されたときに識別できるようにしたいため、 PDOSHOW PROCESSLIST
を使用できません。「生の」SQL を使用する必要があります。
$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();
PDOに関する限り、トランザクションはまだアクティブであるため、これは機能しませんbeginTransaction()
。たとえば、 next で例外がスローされます。
メッセージ「すでにアクティブなトランザクションがあります」を伴う例外「PDOException」
1 つの回避策は次のとおりです。
$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();
これは、2 つが完了したことを意味します。1 つCOMMITs
目は私のコメントで、2 つ目はノーオペレーションですが、pdo のトランザクションを閉じます。(したがって、質問)。
別の回避策は、pdo を完全に除外することです。
$dbconnection->createCommand("START TRANSACTION")->execute();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();
しかし、その後、intransaction()などの pdo 機能が失われ、既に前のトランザクション内にある間に 2 番目のトランザクションを開始しようとしても、例外は発生しません。