将 autocommit 设置为 false 通常不会对读取产生影响,因此,如果这是您正在运行的查询类型,则应该不是问题。
autocommit=false 保证您将在事务中执行查询(插入、删除、更新),这意味着它们要么全部成功(最后提交),要么失败并被滚动背部。
当您插入、更新或执行 aselect ... for update
时,某些行将被锁定,这很难预测,因为它取决于您的引擎、Mysql 版本、隔离级别等。
例如,如果 autocommit=false 并且两个用户需要同时更新相同的行,那么一个用户将被锁定,等待第一个用户完成,无论是提交还是回滚。
假设USER1触发了针对 10 行的数据库更新。
您开始交易,进行更新,进行更多查询......
在提交/回滚之前,USER2触发相同的更新,或者将针对USER1正在更新的一个或多个相同行的更新。
USER2将被锁定,等待USER1提交或回滚,然后才能执行更新。
一种测试方法是打开两个不同的数据库连接,例如,通过命令行或其他客户端,并模拟这种行为。将自动提交设置为 false,在一个客户端上进行更新,在第二个客户端上执行相同操作,然后看到它挂在那里,直到您在第一个客户端上提交或回滚。
这种技术可以非常方便地帮助您了解幕后发生的事情。