事务隔离级别下本质

事务隔离级别本质

在数据库管理系统中,事务保证了一个操作序列可以全部执行或全部不执行(原子性),从一个状态转变到另外一个状态(一致性)。由于事务满足持久性,所以一旦事务被提交之后,数据就能够被持久化下来,又因为事务是满足隔离性的,所以,当多个事务同时处理同一个数据的时候,多个事务之间是互不影响的,所以在多个事务并发操作的过程中,如果控制不好隔离级别,就有可能产生脏读,不可重复读或者幻读等读现象。

读未提交

  • 隔离级别最低,一个事务可以读到另一个事务未提交的数据
内部锁情况
  • 事务在读数据时候未对数据加锁
  • 事务在修改数据的时候只对数据增加行级共享锁
现象
  • 事务1读取某行记录,事务2也可以对这行记录进行读取,更新(因为事务1并未对数据增加任何锁)
  • 事务2对该行记录进行更新时,事务1在此读取该记录,能够读到事务2对该记录的修改版本(因为事务2只增加了共享读锁,事务1可以再增加共享读锁读取数据)
  • 事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束(因为事务1对数据增加了共享读锁,事务2不能增加排他锁进行数据的修改)

读提交

  • 一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据
内部锁情况
  • 事务对当前被读取的数据加行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁
  • 事务在更新某数据的瞬间,必须对其加行级排他锁,直到事务结束才释放
现象
  • 事务1在读取某行记录的整个过程,事务2都可以对该行进行读取(因为事务一对该行记录增加行级共享锁的情况下,事务2同样可以对该数据增加共享锁来读数据)
  • 事务1读取某行的瞬间,事务2不能修改该行,但是,事务1读取完该行数据,事务2便可以对该行数据进行修改(因为事务一在读取一瞬间会对数据增加共享锁,任何事务都不能加排他锁,但是事务一旦读完就会释放行级共享锁)
  • 事务1更新某行记录,事务2不能对这行数据做更新,因为更新的时候会加上排他锁,直到事务结束才会释放锁。所以在事务1没有提交之前,事务2都不能对数据增加共享锁进行数据的读取。所以读提交能够解决脏读问题

可重复读

内部锁情况
  • 事务在读取某数据的瞬间,必须先对其加行级共享锁,直到事务结束才释放
  • 事务在更新某数据的时候,必须先对其加行级排他锁,直到事务结束才释放
现象
  • 事务1在读取某行记录的整个过程,事务2都可以对该行记录进行读取(因为事务1对该行记录增加行级共享锁的情况下,事务2同样可以对该行数据增加共享锁来读数据)
  • 事务1在读取某行记录,事务2不能修改该行数据(因为事务1读取数据会对数据增加共享锁,直到事务提交才会释放,所以整个过程不允许其他事务对该行数据增加排他锁,解决了不可重复读的情况)
  • 事务1更新某行记录时,事务2不能对这行数据做更新,直到事务1结束(因为更新的时候会增加排他锁,直到事务结束才会释放)
  • 会出现幻读情况,mysql已使用MVCC解决了该问题

可序列化

  • 可序列化是最高隔离级别,能够解决脏读,不可重复读,幻读问题
内部锁情况
  • 事务在读取数据时,必须先对其加表级共享锁,直到事务结束才释放
  • 事务在更新数据时,必须先对其加表级排他锁,直到事务结束才释放
现象
  • 事务1正在读取A表中的记录时,则事务2也能够读取A表,但不能对A表作更新,增加,删除,直到事务1结束(因为事务1的关系对表增加了表级共享锁,其他事务只能增加共享锁读取数据,不能进行其他操作)
  • 事务1正在更新A表中的记录,则事务2不能读取A表的任何记录,更不能对A增删改,直到事务1结束(事务1对表增加了表级排他锁,其他事务不能对表增加任何锁)
posted @ 2019-02-17 16:43  我涛  阅读(451)  评论(0编辑  收藏  举报