使用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功能,如果你在先前的交易中尝试启动第二个交易,你就不会得到异常。
答案 0 :(得分:0)
在Mysql上,两次提交都不是问题。
在PDO上,我不确定。如果将第一次提交更改为另一个命令,例如:
,该怎么办?$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("SET @dummy_var=1; /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();