4

MySQL トランザクションを使用しているときに、commit2 回使用すると問題はありますか? 例えば

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 番目のトランザクションを開始しようとしても、例外は発生しません。

4

1 に答える 1