数据库的隔离级别
1.事务
事务只是一个改变,是一些操作的集合;用专业的术语来讲,他就是一个执行单元;事务本身不包含这4个特性,我们需要通过某些手段,尽可能的让这个执行单元满足这个4个特性,那么我们就可能称之他为事务,或者说是一个正确的事务。
2.四特性
- 原子性 :满足原子操作单元,对数据的操作,要么全部执行,要么全部失败
- 一致性 :事务开始和完成,数据必须保持一致
- 隔离性 :事务之间都是相互独立的,中间状态对外不可见
- 持久性 :数据的修改是永久性的
3.隔离级别
3.1并发情况下事务引发的问题
一般情况下,多个单元操作并发执行,会出现以下问题
- 脏读:A事务还未提交,B事务就读到来A事务的结果(破坏隔离级别)
- 不可重复读:A事务在本次事务中,对自己未操作过的数据,进行了多次读取,结果出现了不一致或者记录不存在的情况。(破坏一致性,update和delete)
- 幻读:A事务在本次事务中,对自己未操作过的数据,进行多次读取,第一次读取时,记录不存在,第二次读取时,记录存在了。(破坏一致性, insert)
3.2 解决(指定标准)
为了权衡 【隔离】和【并发】的矛盾,ISO定义来四个事务的隔离级别,每个级别隔离程度不同,允许出现的副作用也不一样。
- 读未提交(read-uncommitted):最低级别,只能保证持久性 (感觉好像没啥用吧)
- 已提交读(read-committed) :语句级别的
- 可重复读(repeateable-read) :事务级别的
- 串行读(seriallzable):最高级别,事务与事务完全串化执行,毫无并发可言,性能极低
3.3 实现[innodb]
- 锁机制 :组织其他事务对数据进行操作,各个隔离级别主要体现在读取数据时加的锁和释放时机
- 读未提交(read-uncommitted) RU:事务读取的时候不加锁
- 已提交读(read-committed) RC:事务读取的时候加行级共享锁(读到才加锁),一但读完,立刻释放锁(并不是等待事务结束才释放)
- 可重复读(repeateable-read) RR:事务读取时加行级锁,直到事务结束才会释放
- 串行读(seriallzable) SZ:事务读取时加表级共享锁,知道事务结束时,才会释放