互联网项目中mysql应该选什么事务隔离级别 转

摘要:
来源:互联网项目中的mysql应该选择什么事务隔离级别1:一般来说,互联网项目中mysql的事务隔离级别设置为ReadCommitted Read Committed Oracle,SqlServer的默认事务隔离级别为ReadCommissid;MySQL的默认事务隔离级别是可重复读取;为什么MySQL的默认事务级别设置为Repeatable Read?在RC隔离级别,没有间隙锁,其他事务可以插入数据!2) 在RR隔离级别下,如果条件列未命中索引,则表将被锁定!

 出处: 互联网项目中mysql应该选什么事务隔离级别

1:一般互联网项目中mysql的事务隔离级别设置成 Read Commited 读已提交

Oracle,SqlServer 的默认事务隔离级别是读已提交(Read Commited);

Mysql 的默认事务隔离级别是可重复读(Repeatable Read);

为什么mysql的默认事务级别设置成Repeatable Read?

答:历史原因

下面分析读已提交(Read Commited)和可重复读(Repeatable Read)这两种隔离级别的效果

为了便于描述,下面将

  • 可重复读(Repeatable Read),简称为RR;
  • 读已提交(Read Commited),简称为RC;

我们为什么选读已提交(Read Commited)作为事务隔离级别!

先搞一个表和数据作为讲解的例子

假设表结构如下

 CREATE TABLE `test` (
`id` int(11) NOT NULL,
`color` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB

数据如下

互联网项目中mysql应该选什么事务隔离级别 转第1张

  1) 在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!

此时执行语句

select * from test where id <3 for update;

在RR隔离级别下,存在间隙锁,可以锁住(2,5)这个间隙,防止其他事务插入数据!
而在RC隔离级别下,不存在间隙锁,其他事务是可以插入数据!

 ps:在RC隔离级别下并不是不会出现死锁,只是出现几率比RR低而已!

2)在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行

此时执行语句

update test set color = 'blue' where color = 'white'; 

在RC隔离级别下,其先走聚簇索引,进行全部扫描。加锁如下:

互联网项目中mysql应该选什么事务隔离级别 转第2张

但在实际中,MySQL做了优化,在MySQL Server过滤条件,发现不满足后,会调用unlock_row方法,把不满足条件的记录放锁。
实际加锁如下 

互联网项目中mysql应该选什么事务隔离级别 转第3张

然而,在RR隔离级别下,走聚簇索引,进行全部扫描,最后会将整个表锁上,如下所示 

互联网项目中mysql应该选什么事务隔离级别 转第4张

 3)在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!

  在5.1.15的时候,innodb引入了一个概念叫做“semi-consistent”,减少了更新同一行记录时的冲突,减少锁等待。
  所谓半一致性读就是,一个update语句,如果读到一行已经加锁的记录,此时InnoDB返回记录最近提交的版本,由MySQL上层判断此版本是否满足update的where条件。若满足(需要更新),则MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁)!
具体表现如下:
此时有两个Session,Session1和Session2!
Session1执行

update test set color = 'blue' where color = 'red'; 

先不Commit事务!
与此同时Ssession2执行

update test set color = 'blue' where color = 'white'; 

  session 2尝试加锁的时候,发现行上已经存在锁,InnoDB会开启semi-consistent read,返回最新的committed版本(1,red),(2,white),(5,red),(7,white)。MySQL会重新发起一次读操作,此时会读取行的最新版本(并加锁)!
  而在RR隔离级别下,Session2只能等待!

关于Mysql中的 semi-consistent read 可参考这篇文章: MySQL介于普通读和加锁读之间的读取方式:semi-consistent read

题外话一个问题: 事务可重复读的意义在哪?

  不可重复读是指在一个事务中对同一数据进行多次读取时,由于其他事务对该数据进行了更新,导致事务中多次读取的结果不一致;而可重复读就是即使其他事务对该数据进行了更新,该读事务多次读取的结果也是一致的。

  这样的话我就有疑惑了:数据本身就被更新了,为什么还要保证多次读取的结果一致?这也只是表面上看上去一致的呀,实际都已经改变了,相反我个人还觉得不可重复读能够及时反映数据的变化,似乎更合理一些?那么可重复读的意义在哪呢?或者说不可重复读会有什么后果呢?

一些回答:

  不可重复读很容易让人陷入一个思维定式那就是 我干嘛需要多次读取一个值 还要保证一致
  要跳出这个思维看本质:我在事务中会不会受到其他事务的影响
  举个简单的例子 数据校对(只是举个例子体现意思 不用太在意具体的业务)
  我要取当前的余额 当前的账单 上个月的余额 我要检验一下数据对不对
  我在事务中取了当前的账单和上个月的余额,好嘛,这时候又有新的订单提交了,我再获取余额是不是就不一致了?

和业务场景有关。

  比如财务对账,某个时刻内,我读取账目来对账之类的操作,这个时候肯定不希望读到的数据再发生变化,比如读已提交。这样既保证当前业务继续进行,又可以保证我在某一时刻内的操作不会有影响。相比较串行化的读写互斥的情况,性能和业务处理灵活性上要好一些。否则一旦查询,其他操作无法进行,一般生产环境是不允许的。

免责声明:文章转载自《互联网项目中mysql应该选什么事务隔离级别 转》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇eclipse项目转android studio详解使用zTree插件构建树形菜单下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySql笔记 --&amp;gt;1

MySQL1、sql、DB、DBMS分别是什么,他们之间的关系?    DB:         DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)    DBMS:         DataBase Management System(数据库管理系统,常见的有:MySQL Oracle DB2 Sybase SqlServer...)    ...

[mysql] mysql批量操作时性能优化

--------------------------------结论--------------------------------- MySql 非批量10万条记录,5700条/秒 MySql 批量(batch)10万条记录,62500条/秒 oracle 非批量插入10万条记录, 4464 条/秒 oracle 批量 (batch)插入10万条记录,...

基于PySpark的网络服务异常检测系统 (四) Mysql与SparkSQL对接同步数据 kmeans算法计算预测异常

基于Django Restframework和Spark的异常检测系统,数据库为MySQL、Redis, 消息队列为Celery,分析服务为Spark SQL和Spark Mllib,使用kmeans和随机森林算法对网络服务数据进行分析;数据分为全量数据和正常数据,每天通过自动跑定时job从全量数据中导入正常数据供算法做模型训练。 使用celery批量导入...

tidb在DDL语句方面的测试

Mysql与tidb测试数据为8000万行。 1、修改一个字段的列名,比如将“ctime”修改为“cctime”。 Tidb测试:   MySQL测试:   2、同一属性之间切换,即修改一个字段的属性大小。比如将int类型修改为bigint类型 Tidb:   Mysql:   MySQL是创建临时表的方式来加字段,因此这个时间花费已超过40分钟,所以停止...

Ubuntu下lamp(PHP+Mysql+Apache)搭建+完全卸载卸载方法

安装apache2 sudo apt-get install apache2 安装完成,运行如下命令重启下: sudo /etc/init.d/apache2 restart 在浏览器里输入http://localhost或者是http://127.0.0.1,如果看到了“It works!“,那就说明Apache就成功的安装了,Apache的默认安装,会...

几篇关于MySQL数据同步到Elasticsearch的文章---第三篇:logstash_output_kafka:Mysql同步Kafka深入详解

文章转载自:https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247484411&idx=1&sn=1f5a371095d61bd0d6461ed111dd252b&chksm=eaa82bd3dddfa2c5b08831bfd4221178b277f03ec74e...