mysql学习笔记

本文详细介绍了MySQL数据库的四种事务隔离级别:未提交读、提交读、可重复读及可串行化。每种级别的特点及其可能导致的问题都有具体说明,并探讨了InnoDB存储引擎如何解决幻读问题。

学习mysql数据库首先要明白mysql的基本逻辑结构:

 

SQL定义的标准中,有这样四种隔离级别(简单点理解就是当一个事物作出修改时,在那些事物内再者事物间是可见的。但是事物的级别实际上确是很复杂的,远比想象的逻辑复杂的多):

未提交读(READ UNCOMMITTED)   :理解为   就算这条当前事物还没有提交,但是对其他事物也是可见的。可以读取未提交的数据势必会造成一种现象,也就是脏读 ,这种隔离级别相对其他隔离级别来说势必对来很多问题,在现实开发中几乎不会用到。这个就好比我们北方人在大澡堂子洗澡,一览无遗。

提交读(READ COMMITTED) :  提交读 大多数关系型默认的隔离级别,MySQL的默认隔离级别也是提交读。  这种方法通俗理解就是,当一个事物开始时只能看到已经提交的事物所做的修改。换一个理解也就是当一个事物在开始到提交之前,他做什么事情了,其他事物是不能看到的。这个隔离级别有时候也会被叫做不可重复读,也就是执行了两次查询操作,可能你查到了不同的结果集。就好像你在家里浴室洗澡一样,把门一关,没人能看到你。

可重复读(REPEATABLE) :  首先解决了脏读的问题。  并且每一次读取到的结果集是一样的。 但在我在高性能的mysql上看到说这个并不是解决幻读的原因(幻读是指在某个事物读取某个范围内的记录时,另外一个事物又在这个范围内插入了新纪录,当之前的事物再次读取该范围的记录时,就会产生一种幻行(Pantow Row)的问题。), 为什么解决了幻读的问题,还是因为MySQL默认使用了InnoDB这个存储引擎。附加:InnoDB和XtraDB存储引擎使用了多版本并发控制机制(MVCC Multiversion Concurrency Control) 来结局幻读的问题,  这个问题我目前也没有理解。有能力的朋友看到留言讲解一下,thank you。  

可串行化(SERIALIZABLE) 这个是最牛逼,最高的隔离级别了。是通过强制事物串行执行,来避免是幻读。 SERIALIZABLE这个会在读取的事物的每一行都加上锁,所以会导致大量的因为"竞争锁"或者连接超时导致的问题,所以通常开发时不会用到这个隔离级别。只有有强制性要求(好比必须确保数据一致性,不会有并发问题)的时候才会迫不得已选用,我感觉开销会变大。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值