4

使用 MySQL 事务时,如果commit两次,会不会有问题?例如

START TRANSACTION
/* Various DB UPDATEs */
COMMIT
COMMIT

经过测试,似乎第二次 COMMIT 是 NO OP 并且同样可能是 a ROLLBACK,对吗?它是无害的还是会成为问题?

据我了解,在第一次提交之后,将启用自动提交,因此第二次提交毫无意义......但这会造成任何伤害吗?


背景资料:

我正在使用 PHP,我有一个数据库事务,例如

$dbconnection->getPdoInstance()->beginTransaction();
/* ... Various DB UPDATEs */
$dbconnection->getPdoInstance()->commit();

但是,我想在我的提交上放一个MYSQL COMMENT以便在我看到它时可以识别它SHOW PROCESSLIST,因此我不能使用PDO,我必须使用“原始”SQL:

$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();

除了这不起作用,因为就 PDO 而言,事务仍然是活动的,所以它会在下一个抛出异常beginTransaction(),例如

异常“PDOException”与消息“已经有一个活动事务”

一种解决方法是:

$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();

这意味着两个COMMITs已经完成,第一个是我的评论,第二个是无操作但会关闭 pdo 的事务。(因此问题)。

另一种解决方法是将 pdo 完全排除在外:

$dbconnection->createCommand("START TRANSACTION")->execute();
/* ... various DB UPDATEs */
$dbconnection->createCommand("COMMIT /* My Comment */")->execute();

但是随后您将失去诸如intransaction()之类的 pdo 功能,并且如果您尝试在先前的事务中启动第二个事务,则不会出现异常。

4

1 回答 1

1

在 Mysql 上,两次提交不是问题。

在 PDO 上,我不确定。如果您将第一次提交更改为另一个命令,例如:

$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("SET @dummy_var=1; /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();
于 2013-11-06T13:56:50.060 回答