在使用MySQL事务时,如果commit
两次会不会有问题?例如
START TRANSACTION
/* Various DB UPDATEs */
COMMIT
COMMIT
经过测试,似乎第二个提交是一个没有操作,同样可能是一个ROLLBACK
,对吗?它是无害的还是可能成为问题?
据我了解,在第一次提交之后,将自动提交,因此第二次提交毫无意义......但它会造成任何伤害吗?
背景信息:
我正在使用PHP,并且我有一个数据库事务,例如
$dbconnection->getPdoInstance()->beginTransaction();
/* ... Various DB UPDATEs */
$dbconnection->getPdoInstance()->commit();
但是,我想在我的提交上放一个 MYSQL 注释,以便我在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功能,并且如果您尝试在先前事务中启动第二个事务,则不会遇到异常。
在Mysql上,两次提交不是问题。
在PDO上,我不确定。如果将第一次提交更改为另一个命令,例如:
$dbconnection->getPdoInstance()->beginTransaction();
/* ... various DB UPDATEs */
$dbconnection->createCommand("SET @dummy_var=1; /* My Comment */")->execute();
$dbconnection->getPdoInstance()->commit();