
1、根据官方资料,innodb支持ANSI定义的4种隔离级别。
2、Mysql 的Serializable isolation,这种事务的隔离级别下,所有select语句都会被隐式的转化为select … in share mode,如果有未提交的事务正在修改某些行,所有读取这些行的select都会被阻塞住。注意比较:同样是 Serializable isolation隔离级别,oracle的读是不会阻塞的,mysql 的读写都会阻塞。
3、 Mysql 的Repeated Readisolation,在该隔离级别下普通的读都使用mvcc方式,即不加锁定的无阻塞读取。相对于select for update、delete、update等操作,若使用唯一索引,那么使用item(row) lock;若不使用唯一索引进行范围扫描,那么使用 Predicate lock,mysql里的昵称叫gap lock。基于以上使用锁的方式,mysql在此隔离级别防止non-repeableread 现象发生。注意:oracle 没有这个隔离级别哦,innodb的RR隔离级别依然没有防止lost update现象出现。
4、Mysql 的read committed隔离级别和oracle的方式一致的,不需要单独解释了。
总结:一般在使用mysql的场景中没企业或组织使用Serializable isolation和uncommitted isolation,因为Serializable isolation读和写都互相阻塞,会大大影响并发;uncommitted isolation因为会读取脏数据,会大大影响数据库的一致性。read committed isolation和oracle的使用机制是一致的,所以被广泛采用。较为鸡肋的是Repeated Read isolation,mysql使用了一套自己开发的锁来实现,能防止脏读、非重复读、幻象读现象,不能防止丢失更新读现象。相比read committed,Repeated Read降低了并发能力,换来的仅仅是防止非重复读现象有点得不偿失。