浅谈mysql隔离级别

         前言

         写本blog之前,首先声明,本人水平不高,此处只是用于促进自己对于知识体系的思考和总结,所讲有错之处,欢迎留言指正,我将洗耳恭听,不喜者勿喷。

        正文:

        1  隔离级别 -- 针对读操作的一种事务之间的隔离机制

                1.1  mysql隔离级别的四大类

                1.1.1  read_uncommitted 

                        --- 读到其他事务未提交的修改内容 ,毋庸置疑,这会造成 dirty read / non-repeatable read / plantom read。

                1.1.2 read_committed 

                        --- 读到其他事务最后一次 提交 时的数据,也叫做 shapshot / 快照数据,可以避免 dirty read,但是无法避免 

                             non-repeatable read ,因为 其它事务如果在本事务未提交前多次update并提交数据, 那么很容易造成前

                             后读取到的数据不一致。

                1.1.3 repeatable read

                       --- 和sql_server ,oracle把 read_committed作为读取数据时的默认隔离级别不一样, myslq将repeatable read作

                             为默认的隔离级别,这种隔离级别,本事务开始后会读取不到其他事务对数据进行update操作,即其他事务

                             可以对本事务所查询的数据进行修改,但是本事务在commit之前是无法查看到的,只能看到该本事务开始之

                             前最后一次commit之后的数据,这样就从根本上避免了non-repeatable read。

                      --- 注意:repeatable read 隔离级别,可以杜绝 dirty read  /  unable repeatable read ,但是无法避免 plantom read

                            原因是,这种方式时只对update操作,而不包括delete / insert。至于 为什么这么设定,个人认为insert/delete

                            要比update操作对隔离性的影响较小(其实就是 我不知道 随便脑补的)。

                      --- 注意:当隔离级别是 repeatable read时,其他事务如果先对本事务的一条数据进行修改,那么在该事务commit

                            之前,本事务 对这条同样的数据进行的修改,都是被 阻塞执行的。这是 repeatable read 对update操作的影        

                            响之一。

                1.1.4  serializable

                      --- 串行读,就是 所有事务 都一个个 排队阻塞执行,即 一旦在串行读的情况下,读锁被获取后,那么一直到查询完

                            毕其他事务的 update/insert/delete都是无法被执行的。这样就可以避免所有dirty read / non-repeatable read /

                            plantom read了,这实际上 是对写操作来进行加锁操作了,类似 排它锁,select * from t for update 应该就是

                            这个原理,拿到这个具有排它性的读锁的同时 本事务可以修改数据。                   

                

        

你可能感兴趣的:(事务问题)