在 InnoDB 中,如果您没有更改 autocommit 的默认设置(即“on”),则无需显式启动或结束单个查询的事务。如果启用自动提交,InnoDB 会自动将每个 SQL 查询包含在事务中,这相当于START TRANSACTION; query; COMMIT;.
如果你START TRANSACTION在 InnoDB 中显式使用 autocommit ,那么在START TRANSACTION语句之后执行的任何查询要么全部执行,要么全部失败。这在银行环境中很有用,例如:如果我将 500 美元转入您的银行账户,那么只有从我的银行余额中减去该金额并添加到您的银行账户中,该操作才会成功。所以在这种情况下,你会运行类似
START TRANSACTION;
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan';
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis';
COMMIT;
这确保了两个查询都将成功运行,或者没有一个,但不仅仅是一个。
这篇文章有更多关于何时应该使用事务的信息。
在 InnoDB 中,您很少需要锁定整个表;与 MyISAM 不同,InnoDB 支持行级锁定。这意味着客户端不必锁定整个表,从而迫使其他客户端等待。客户端应该只锁定他们实际需要的行,允许其他客户端继续访问他们需要的行。
您可以在此处阅读有关 InnoDB 事务的更多信息。您关于死锁的问题在文档的第14.2.8.8和14.2.8.9节中得到解答。如果查询失败,您的 MySQL 驱动程序将返回一条错误消息,指出原因;如果需要,您的应用应重新发出查询。
最后,在您的示例代码中,您使用了mysql_query. 如果您正在编写新代码,请停止使用旧的、缓慢且已弃用mysql_的 PHP 库,而改用mysqli_或 PDO :)