在Mysql中运行第二次提交的结果是什么?

时间:2013-11-06 13:44:28

标签: php mysql transactions

使用MySQL事务时,如果commit两次,是否会出现问题? e.g。

START TRANSACTION
/* Various DB UPDATEs */
COMMIT
COMMIT

测试后,似乎第二个COMMIT是NO OP并且可能同样是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功能,如果你在先前的交易中尝试启动第二个交易,你就不会得到异常。

1 个答案:

答案 0 :(得分:0)

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

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

,该怎么办?
$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("SET @dummy_var=1; /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();