我写
mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");
在我写所有的查询之前。然后检查它们是否都是真的,然后写道:
mysql_query("COMMIT");
但如果其中一个查询失败,我就会传递COMMIT查询。那么,如果其中一个查询失败,我真的需要回滚功能吗?因为没有回滚,它也可以工作。
谢谢。
发布于 2010-05-02 02:47:39
我认为你是在问是否有必要执行回滚,因为如果没有它,提交仍然不会被应用。这在技术上是正确的,但这只是因为事务仍然是打开的,因为您还没有结束它。任何隐式提交事务的操作(例如,启动一个新事务)都将表现为您运行了COMMIT,这与您想要的相反
发布于 2010-05-02 02:45:24
使用事务的原因是将多个更改组合在一起,以便它们都自动成功,否则,如果它们不能,就不做任何更改。换句话说,如果任何更改失败,事务将使数据库处于逻辑上不一致的状态。
示例:在一次更新中借记一个帐户,在另一次更新中记入另一个帐户。这代表着一笔转账。如果借记成功但贷记失败,你应该回滚整个交易,否则看起来钱就消失得无影无踪了。
因此,预期的用途是在其中一个更改失败的情况下回滚事务。
您似乎是在说,在您的应用程序中,如果其中一个更改失败了,也没什么问题。这让我认为您将更改分组到事务中是不恰当的。
决定哪组更改必须一起成功,并将这些更改放入一个事务中。任何不符合此组的更改都应在单独的事务中进行。
发布于 2010-05-02 02:47:58
您应该显式地使用ROLLBACK来明确您对以后必须阅读您的代码的任何人所做的操作,实际上可能是您:)
此外,如果您添加了在提交/回滚之后执行的代码,最好显式触发它,以获得更可预测的数据状态。如果您依赖于自动回滚,则代码可能期望数据库处于未修改状态,而实际上它仍处于未提交事务中。
https://stackoverflow.com/questions/2751129
复制相似问题