Mysql的隔离级别 以及对脏读、不可重复读、幻读的理解
Mysql的隔离级别
Mysql的默认隔离级别为:Repeatable read
Oracle的默认隔离级别为:Read committed
Mysql有四大隔离级别
1.Read uncommitted 读未提交内容
2.Read committed 读提交内容
3.Repeatable Read 可重读
4.Serializable 序列化(可串行化)
这四大隔离级别分别可以,逐个解决脏读、不可重复读、幻读这几类问题
脏读
读取未提交的数据,也被称之为脏读(Dirty Read)。
例如:
公司发工资了,领导把10000元打到bin的账号上,但是该事务并未提交,而bin正好去查看账户,发现工资已经到账,是10000元整,非常高兴。可是不幸的是,领导发现发给bin的工资金额不对,是5000元,于是迅速回滚了事务,修改金额后,将事务提交,最后bin实际的工资只有5000元,bin空欢喜一场。
以上的案例,并发了两个事务,"事务A:领导给bin发送工资"、"事务B:bin查询工资"。
事务B读取到了事务A尚未提交的数据。
不可重复读
一个事务只能看见已经提交事务所做的改变。就被称之为不可重复读(Nonrepeatable Read)。
例如:
bin拿着工资卡去消费,系统读取到卡里确实有5000元,而此时她的老婆也正好在网上转账,把bin工资卡的5000元转到另一账户,并在bin之前提交了事务,当bin扣款时,系统检查到bin的工资卡已经没有钱,扣款失败,bin十分纳闷,明明卡里有钱,为何没有。
以上的案例,并发了两个事务,"事务A:bin消费"、"事务B:bin的老婆转账"。
事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
幻读
当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。也被称之为幻读 (Phantom Read)。
幻读:类似于不可重复读,都是在一个事务周期内读的数据不一致,区别在于幻读是侧重于插入操作带来的影响,而不可重复读是编辑或者删除带来的影响。
例如:
bin的老婆管斌很严厉,每个月bin的老婆都要去查看bin的消费记录。一天,她正在查询bin当月的总消费金额为2000元,而此时bin正在外面和朋友们吃火锅,吃完后去柜台买单,消费500元,即新增了一条500元消费记录,并且提交了事务,随后bin的老婆将bin当月的总消费打印在一张A4纸上,却发现消费的总余额为2500,bin的老婆就很疑惑,以为出现了幻觉。
以上的案例,并发了两个事务,"事务A:bin老婆查询"、"事务B:bin消费"。
事务A先读取了数据,事务B紧接了添加了新的数据,并提交了事务,事务A再次读取该数据时,数据已经发生了改变。