我有
的典型交易START TRANSACTION
INSERT INTO ...
UPDATE ...
DELETE ...
COMMIT
问题1: UPDATE
失败不会阻止交易。在单个查询中,我使用mysql_affected_rows()
来检查UPDATE
的成功,但是如何在交易过程中这样做?
问题2:如何检测哪个查询导致事务停止?在PHP
?
答案 0 :(得分:2)
假设您根据提及的mysql_*()
使用了mysql_affected_rows()
函数,您应该只是在自己的mysql_query()
中调用事务的每个阶段,并检查其成功与否每个阶段。除非将它作为存储过程包装,否则必须将它们称为单独的语句,因为mysql_query()
在一次调用中不支持多个语句。
function doTransaction() {
mysql_query("START TRANSACTION;");
$ins = mysql_query("INSERT INTO ....");
if (!$ins) {
// fail
mysql_query("ROLLBACK");
return FALSE;
}
$upd = mysql_query("UPDATE...");
if (!$upd) {
// fail
mysql_query("ROLLBACK");
return FALSE;
}
if (mysql_affected rows() === 0) {
// no rows updated, rollback if necessary
mysql_query("ROLLBACK");
return FALSE;
}
$del = mysql_query("DELETE FROM...");
if (!$del) {
// fail
mysql_query("ROLLBACK");
return FALSE;
}
// All succeeded
mysql_query("COMMIT");
return TRUE;
}