MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理

MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理

所谓隔离级别,就是在数据库事务中,为保证数据读写的正确性而提出的定义,它并不是MySQL专有的概念,而是源于ANSI/ISO制定的SQL-92标准。

MySQL InnoDB引擎,是基于MVCC(Multi-Versioning Concurrency Control)和锁的复合实现,按照隔离程度从低到高,MySQL失误隔离级别分为四个不同层次:

  • 读未提交(Read uncommitted),就是一个事务可以看到其他事务尚未提交的修改,这是最低隔离水平,允许脏读出现。
  • 读已提交(Read committed),事务能看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,当然脏读也不会出现。读已提交仍然是比较低级别的隔离,并不保证再次读取时能获取同样的数据,也就是允许其他事务并发修改数据,允许不可重复读和幻象读出现。
  • 可重复读(Repeatable reads),保证同一个事务中多次读取的数据是一致的,这是MySQL InnoDB引擎默认的隔离级别,但是和其它数据库实现不同的是,可以简单认为MySQL在可重复读级别不会出现幻象读。
  • 串行化(Serializable),并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,如果SQL使用WHERE语句,还会获取区间锁,这是最高隔离级别。

悲观锁和乐观锁也不是数据库中独有的概念,而是并发编程的基本概念。主要区别在于,操作共享数据时,“悲观锁”认为数据出现冲突的可能性更大,而“乐观锁”则是认为大部分情况不会出现冲突,进而决定是否采取排他性措施。

在MySQL数据库应用开发中,悲观锁一般就是利用类似SELECT…FOR UPDATE这样的语句,对数据加锁,避免其他事务意外修改数据。乐观锁则与Java并发包中AtomicFieldUpdater类似,也是利用CAS机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。

MVCC其本质就是可以看做是一种乐观锁机制,而排他性的读写锁、双阶段锁则是悲观锁的实现。

没有更多推荐了,返回首页