前言:
写本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 应该就是
这个原理,拿到这个具有排它性的读锁的同时 本事务可以修改数据。