【问题标题】:Difference between set autocommit=0 and set session transaction isolation level REPEATABLE READ;start transaction;?set autocommit=0 和 set session transaction 隔离级别 REPEATABLE READ;start transaction; 之间的区别?
【发布时间】:2015-06-19 03:15:11
【问题描述】:

提到here innodb 中任何事务的默认隔离级别都是可重复读取的。 在上面的同一个链接中,还提到如果我确实设置了 autocommit=0 那么会话总是打开事务。 现在我的理解是如果我这样做了

set session transaction isolation level REPEATABLE READ;

start transaction;

DML(insert, update, delete) queries

commit;

 set autocommit=0;

    DML(insert, update, delete) queries

    commit;

两者都应该做同样的事情,应该以可重复的读取隔离级别运行。最后我需要提交或回滚。

但是当我将它们用于大量查询时,第一个需要很多时间,第二个需要很少的时间。很明显它们是不一样的。我错过了什么?自动提交设置为 0 时事务的默认隔离级别是多少?提前致谢。

编辑:如果我设置 autocommit=0,我得到了默认隔离级别的答案;(感谢 kostja)从 show variables like "%isolation"; 可以看出我还没有弄清楚为什么第一个更慢。

【问题讨论】:

    标签: mysql transactions isolation-level


    【解决方案1】:

    在会话中设置自动提交不会全局更改它。 确定不是这样?

    回答您的问题,事务隔离级别不依赖于自动提交。

    【讨论】:

    • 但我只需要为我的会话设置 autocommit=0。我需要在单个会话中运行查询,我看不出它与我的问题有什么关系。
    • 很难根据您的问题说您在哪里运行查询。请更新问题,这种可能性可能会被排除。第二个问题是交易在哪里结束。 set autocommit = 0 将停止自动提交,因此您最终可能会得到一个包含数百条语句的非常长的事务。确定不是这样?
    • 我编辑了我的问题。我在所有查询结束时触发提交,我猜这两个事务都有相同数量的查询要执行。我猜差异在于隔离级别。但这只是猜测。
    • 如果您在客户端-服务器应用程序上运行每个查询,则额外的启动事务语句可能会增加额外的网络往返。执行“启动事务”或“设置事务隔离级别语句”时可能会做一些工作,这也有点多余。但是查询的行为和性能都不应根据事务的启动方式而改变。
    • 我的服务器在我的本地机器上运行。因此 2 个查询的网络延迟应该不会太多。两种情况下的执行时间之间存在明显差异。您引用的隔离级别不依赖于自动提交,我的理解是当有事务时有一个隔离级别。当我设置 autocommit=0 时,它是否适用于会话事务?
    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多