【后端面经-数据库】MySQL的事务隔离级别简介
目录[*]0. 事务的概念
[*]1. 三类问题
[*]2. 事务隔离级别
[*]3. 操作指令
[*]4. 总结
[*]5. 参考博文
0. 事务的概念
事务指的是一连串的集中操作指令,一个事务的执行必须执行完所有的动作才能算作执行结束。事务具有四个特点,简记作ACID:
[*]A-Atomicity: 原子性,事务的执行必须保证所有的动作都执行完毕;
[*]C-Consistency: 一致性,事务的执行必须保证数据的一致性;
[*]I-Isolation: 隔离性,事务的执行必须保证数据的隔离性;
[*]D-Durability: 持久性,事务的执行必须保证数据的持久性。
而事务隔离级别则是在大型数据库多个事务执行的过程中,针对事务并行进行的机制设计,主要是围绕Isolation进行设计的。
1. 三类问题
[*]脏读
[*]过程:
[*]事务A正在写某一行数据,未提交;
[*]事务B并行读取该行数据,用于操作;
[*]事务A撤销写操作,这是对于事务B来说,之前的读操作就是错误的。
[*]读事务读取了写事务未提交的数据,而造成错误读取。
[*]举例
[*]小明今天发工资,一开始在财务系统上查询是工资50000元,很高兴地准备买新电脑,但是这是财务正在敲数据的时候一时疏忽,实际上工资只有5000元,财务在审核数据准备提交的时候发现了这个错误并修改过来,小明很失望。
[*]这里的小明就是读事务,财务就是写事务。
[*]不可重复读
[*]过程:
[*]事务B读取的是数据库中的某一行数据,用于操作;
[*]事务A开始对这行数据进行写操作并完成,数据库的数据改变;
[*]事务B再次读该数据库的这一行数据,发现数据改变;
[*]读事务两次读同一行数据,但是两次读取的数据并不一致。
[*]举例
[*]小明和小红打赌,这个月工资是1k,两个人几乎同时发出查询请求,但是小明先读取到了原始数据是1k,而财务核对之后再次修改了工资为2k,小红在这之后才并发读取到工资是2k,两人认为读操作是并行的,同时进行,虽然知道这中间可能是财务进行了修改,但是两人都认为自己读取的才是最终数据,因此吵了起来。
[*]幻读
[*]过程
[*]事务B读取数据库中的一批数据,用于操作;
[*]事务A添加了一行数据,并完成操作,数据库的数据改变;
[*]事务B再次读该数据库的数据,发现这一批数据改变;
[*]读事务两次读取同一行数据,但是两次读取的数据不一致。(这和不可重复读操作是一致的)。
[*]举例
[*]小明被领导要求,改动财务系统上的ID数据格式,从A格式全都转为B格式,小明读取数据库中的数据之后开始修改,这时候,财务发现新来了一位员工叫小红,于是把小红的记录添加在财务系统上,ID格式依然是A格式。小明工作完成之后给领导看,领导却发现有一个人的数据没有改过来,很是恼火,把小明批评了一番。
[*]幻读和不可重复读的区别
[*]幻读是针对同一批数据,不可重复读针对的是同一行数据
2. 事务隔离级别
[*]读未提交(read uncommitted)
[*]一个事务在写某一行数据的时候,允许其他事务并行读取该行数据,但是不允许写该行数据;
[*]允许多个事务并行读取数据库中的数据,但是不允许并行写入某一行数据;
[*]可能会出现脏读:
[*]解决方案:排他锁
[*]读已提交(read committed)
[*]一个事务在写某一行数据的时候,不允许其他事务读或者写该行数据;
[*]允许多个事务并行读取数据库的数据;
[*]可能都造成不可重复读:
[*]可重复读(repeatable read)
[*]一个事务在读数据的时候,其他事务不允许写,可以读。
[*]一个事务在写数据的时候,其他事务不可以读或者写。
[*]可能会造成幻读:
[*]MySQL默认的隔离级别。
[*]串行化(serializable)
[*]一个事务一个事务串行执行,不允许任何事物并行;
[*]能够解决幻读、不可重复读、脏读的问题;
[*]成本高,一般不适用
3. 操作指令
[*]查看当前的隔离级别SELECT @@tx_isolation;
[*]设置隔离级别 settransaction isolation level 隔离级别名称;//方式1
set tx_isolation='隔离级别名称';//方式2
``
4. 总结
对前期的事务隔离级别做一个表格梳理
5. 参考博文
[*]参考博文-1
[*]参考博文-2
来源:https://www.cnblogs.com/CrazyPixel/p/17481063.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]