在 Web 应用程序中禁用 MySQL 的 "auto commit" 模式是一种好习惯吗?

Is it good practice to leave MySQL's "auto commit" mode disabled across a web application?

关于 MySQL 和 InnoDB 表,全局禁用 autocommit 模式是否被认为是好的做法,以便必须显式提交代码中的所有 SQL 语句?这会引入任何开销或其他不利条件吗?

根据我的经验,如果你的框架支持的话,默认启用它会更好。如果忘记提交,未提交的事务可能会锁住很多资源。

它不会增加任何开销。每个自动提交事务与具有显式开始和提交的事务执行相同的工作,但自动提交事务会在每个 SQL 语句完成后立即提交。

启用自动提交没有坏处。如果您显式地启动一个事务,这只会在您提交之前关闭该会话中的自动提交。然后它会返回自动提交,直到您明确开始另一个事务。

正如@Sherry 指出的那样,全局关闭自动提交的风险在于,您可能在某处有未明确立即提交的代码。当您可能不打算这样做时,这会使交易继续进行。这使得会话保持锁定状态,可能会阻塞其他会话。它还禁止及时清理回滚段。

在我的应用程序中,我坚持使用自动提交,除非在特定情况下我希望将多个语句收集到一个事务中。然后我就开始针对该特定案例进行交易。在任何情况下,我都会启用全局自动提交。