PHP的mysqli中,commit或rollback会隐式地将autocommit打开吗?

4
我正在使用mysqli类在PHP中进行交易,并发现autocommit()的文档非常不完整。 我从示例推断出,将autocommit设置为false会隐式执行“begin transaction”。这是正确的吗? 更重要的是,我没有看到autocommit何时重置为true,我假设在事务完成后应该这样做。当调用commit()或rollback()方法时,是否会自动发生这种情况?
2个回答

2
它不会隐式执行“START TRANSACTION”,因为这会执行即席事务:http://dev.mysql.com/doc/refman/5.0/en/commit.html 使用autocommit(false),每次执行写入查询时必须COMMIT才能将其永久更新到磁盘上。从那时起,在该连接中的所有查询都是如此。如果使用autocommit(true),运行一个更新前使用START TRANSACTION,然后运行COMMIT,再运行另一个更新,那么两个更新将立即应用(即不需要第二个COMMIT)。 autocommit永远不会重置为true,但它仅在会话期间设置(MySQL会话,而不是PHP会话)。

还有两个问题不太清楚。如果我将autocommit设置为false,那么每次写操作后我是否必须显式提交?我不能将autocommit设置为“true”以避免这种情况吗? - Jim
此外,当你说“如果你使用START TRANSACTION,运行一个update,再运行COMMIT,然后再运行另一个…”时,你必须调用COMMIT来提交第一次更新吗?难道这不应该自动发生吗?谢谢。 - Jim
@Jim 是的,两个问题都是。autocommit默认设置为true。但要明确一点:如果您将autocommit设置为true,则不会提交任何未完成的查询;您仍然必须运行COMMIT。我建议您根本不要触摸autocommit;只有在需要时才显式使用事务处理。 - Explosion Pills

0

Autocommit(FALSE)会在下面的查询中保持不变。在执行提交语句后,autocommit会恢复到true状态。如果回滚操作也是这样,则不确定。

我使用这种方式已经几年了,一直都很好用。

当您希望数据库具有一致性时,这是一种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接