MySQL SET TRANSACTION 设置事务隔离级别




1.  首先说一下autocommit


    默认情况下autocommit的开关是打开的,也就是ON,查看方法

方法1. select @@[global/session].autocommit; 
方法2. show [global/session] variables like 'autocommit';

    其中global代表的是全局,session代表的是当前。可以不写global和session,默认似乎就是session了。


    autocommit的作用

    顾名思义,自动提交,在命令行执行sql语句的时候,每输入一行语句并执行实质上就是完成了一次事务,因为他自动commit了,当把autocommit关闭后,则执行的语句并未真实提交,在不显示执行commit命令前,其实都还在当前事务中,如果另开一个窗口执行sql语句,如果该窗口的隔离级别是read committed那么将看不到之前那个窗口(会话)中未提交的对表修改。


2. 设置隔离级别

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
  {
       READ UNCOMMITTED
     | READ COMMITTED
     | REPEATABLE READ
     | SERIALIZABLE
   }
This statement sets the transaction isolation level globally, for the current session, or for the next transaction:

·With the GLOBAL keyword, the statement sets the default transaction level globally for all subsequent sessions. Existing sessions are unaffected.

·With the SESSION keyword, the statement sets the default transaction level for all subsequent transactions performed within the current session.

·Without any SESSION or GLOBAL keyword, the statement sets the isolation level for the next (not started) transaction performed within the current session.
设置隔离级别可以使用上述语句进行,唯一的区别在于是否使用 GLOBAL | SESSION 还是什么都不用


要说的是使用GLOBAL | SESSION  的话设置的是默认的隔离级别,注意default默认二字,GLOBAL将设置全局默认的隔离级别,而SESSION将设置本次会话(可以理解为你连接到mysql服务器的这个窗口,别人也会开窗口但是你影响不到别人的窗口中去)的所有事务的隔离级别并在当前这个事务中起效。

GLOBAL | SESSION  都不用,就是设置本次命令及以后的隔离级别,注意不是默认隔离级别,如果执行了不带GLOBAL | SESSION  的set命令将设置了当前事务的隔离级别,但是如果下个事务没有使用set设置的话就会调用默认的隔离级别。        


3. 结论

查看隔离级别命令 select @@[global/session].tx_isolation 或者 show variables like 'tx_isolation' 看到的是默认的隔离级别,分为全局默认和本会话默认隔离级别,看不到执行set transaction isolation level的结果,因为该语句设置的不是默认值,而是当前使用的值。


执行set transaction isolation level的确起效了,只是目前不知道怎么去查看。当执行该句时,那么当前的事务将使用该隔离级别,一旦commit后将继续使用默认的隔离级别,也就是说set transaction isolation level的作用域仅限于当前的这个事务,加了GLOBAL|SESSION则是设置默认的隔离级别,两者是不冲突的,也就是说你设置默认值之后,如果不显式执行隔离级别设置那么就用默认隔离级别,显式设置了的话也就在本事务中使用该隔离级别。



4.附录

在进行试验过程中,首先关闭了autocommit才能看到read committed和read uncommitted隔离级别的效果,否则写完sql语句运行就自动隐式执行了commit。

时刻明确自己的autocommit有没有自动开启,若开启了,其实在执行完一条语句后就立马有个你看不到的commit执行了,也就是一个事务已经结束。





本文纯属个人理解,如有错误还望不吝指正,或者讨论,感激不尽

发布了21 篇原创文章 · 获赞 12 · 访问量 11万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览