使用 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 功能,并且如果您尝试在先前的事务中启动第二个事务,则不会出现异常。