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

SQL定义的标准中,有这样四种隔离级别(简单点理解就是当一个事物作出修改时,在那些事物内再者事物间是可见的。但是事物的级别实际上确是很复杂的,远比想象的逻辑复杂的多):
未提交读(READ UNCOMMITTED) :理解为 就算这条当前事物还没有提交,但是对其他事物也是可见的。可以读取未提交的数据势必会造成一种现象,也就是脏读 ,这种隔离级别相对其他隔离级别来说势必对来很多问题,在现实开发中几乎不会用到。这个就好比我们北方人在大澡堂子洗澡,一览无遗。
提交读(READ COMMITTED) : 提交读 大多数关系型默认的隔离级别,MySQL的默认隔离级别也是提交读。 这种方法通俗理解就是,当一个事物开始时只能看到已经提交的事物所做的修改。换一个理解也就是当一个事物在开始到提交之前,他做什么事情了,其他事物是不能看到的。这个隔离级别有时候也会被叫做不可重复读,也就是执行了两次查询操作,可能你查到了不同的结果集。就好像你在家里浴室洗澡一样,把门一关,没人能看到你。
可重复读(REPEATABLE) : 首先解决了脏读的问题。 并且每一次读取到的结果集是一样的。 但在我在高性能的mysql上看到说这个并不是解决幻读的原因(幻读是指在某个事物读取某个范围内的记录时,另外一个事物又在这个范围内插入了新纪录,当之前的事物再次读取该范围的记录时,就会产生一种幻行(Pantow Row)的问题。), 为什么解决了幻读的问题,还是因为MySQL默认使用了InnoDB这个存储引擎。附加:InnoDB和XtraDB存储引擎使用了多版本并发控制机制(MVCC Multiversion Concurrency Control) 来结局幻读的问题, 这个问题我目前也没有理解。有能力的朋友看到留言讲解一下,thank you。
可串行化(SERIALIZABLE) 这个是最牛逼,最高的隔离级别了。是通过强制事物串行执行,来避免是幻读。 SERIALIZABLE这个会在读取的事物的每一行都加上锁,所以会导致大量的因为"竞争锁"或者连接超时导致的问题,所以通常开发时不会用到这个隔离级别。只有有强制性要求(好比必须确保数据一致性,不会有并发问题)的时候才会迫不得已选用,我感觉开销会变大。
本文详细介绍了MySQL数据库的四种事务隔离级别:未提交读、提交读、可重复读及可串行化。每种级别的特点及其可能导致的问题都有具体说明,并探讨了InnoDB存储引擎如何解决幻读问题。
2万+

被折叠的 条评论
为什么被折叠?



