MySQL中事务的隔离级别
MySQl InnoDB存储引擎实现SQL标准的4种隔离级别(RU,RC,RR,serializable),用来限定事务内外的哪些改变时可见的,哪些时不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。MySQL数据库通过show variables like '%tx_isolation%'
命令来查看当前数据库的隔离级别。比如,我的电脑上执行此指令的结果如下:
Variable_name |Value |
--------------|----------------|
tx_isolation |REPEATABLE-READ |
可以通过set global|session transaction isolation level
命令修改全局或者当前会话的事务隔离级别。
目前MySQL版本默认的隔离界别时REPEATABLE-READ
。
4种隔离级别:
- 读未提交(read uncommitted),简称 RU —— 在其中一个事务中,可以读取到其他事务未提交的数据变化。这种读取其他绘画还没提交的事务,叫做 脏读 现象。在生产环境中不建议使用。
- 读已提交(read committed),简称 RC —— 在其中一个事务中,可以读取到其他事务已经提交的数据变化。这种读取也可以叫做 不可重复读 ,允许 幻读 现象的发生,是Oracle数据库默认的事务隔离级别。
- 可重复读(repeatable read),简称 RR ,它是MySQL默认的事务隔离级别——在其中一个事务中,直到事务结束前,都可以反复读取到事务刚开始时看到的数据,并一直不会发生变化,避免了脏读、不可重复读和幻读现象的发生。
- 串行(serializable)—— 在每个读的数据行上都需要加表级共享锁,在每次写数据时都需要加表级排他锁。着就会造成InnoDB的并发能力下降,大量的超时和锁竞争就会发生。不建议使用到生产环境中。
对于RU、RR、RC可以这么理解,举个例子:
你要去一个长达十年的星际旅行。
在旅行前,你和你的女朋友做最后一次告别。
如果在告别前,你的女朋友给了你一张他的照片。
每次你在宇宙飞船上寂寞的时候,都会看看你女朋友的这张照片,而这张照片上面你的女朋友一直都没有变。这就是 可重复读(RR) 。
如果你在宇宙飞船上可以和你的女朋友进行视频聊天,而每次视频聊天之前你的女朋友都会化妆,画一个很好看的妆,然后美美地和你视频聊天(我们假设每次化妆相当于女朋友这个事务进行了一次提交),你每次都可以看到你女朋友不同的妆容,那么这就是 读已提交(RC) 。
如果你任何时候都能和你的女朋友视频,但是有的时候你的女朋友还没有来得及化妆,而你的女朋友还是那种不化妆奇丑无比的,见光死的那种,虽然其实你的女朋友不想让你看到她没有化妆的样子,但是有的时候你的视频通话请求来的触不及防(可能就是她刚睡醒的时候),那么你不光能够看到她化妆的样子,还能看到她见光死的样子,这就是 读未提交(RU) 。
所以我们可以看到:
MySQL默认使用 可重复读 ,它的广告标语是: “让你看到我十年都不变的美貌!” 。
Oracle默认使用 读已提交 ,他的广告标语是:“每一次让你看到我都觉得美美的!” 。
不建议使用 读未提交 ,因为不化妆的你女朋友容易引起不适,引发分手问题。
当然,这只是你的女朋友,我的女朋友,即使不化妆,也是美美的(偷笑)。