计算库隔离性转载

原创
小哥 3年前 (2022-10-28) 阅读数 43 #大杂烩

数据库隔离级别
数据库事务的隔离级别为4从低到高。Read uncommitted、Read committed、Repeatable read、Serializable这四个层次可以逐一解决脏读、不可重复读取和幻读的问题。

√: 可能出现 ×: 不会出现
脏读 不可重复读取 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable read × × √
Serializable × × ×

注意:我们讨论隔离级别场景,主要是在多个事务并发的情况下,因此下一个解释将围绕事务并发进行。
Read uncommitted 读未提交
公司拿到了工资,领导也拿到了5000元打到singo帐户,但交易未提交,并且singo刚查了一下账,发现工资已经发了,是的。5000元整,很开心。不幸的是,领导发现singo是的,工资的数额是错的。2000元,就这么迅速地回滚交易,修改金额,提交交易,最后singo实际工资只是2000元,singo空虚的joy。

出现上述情况,即我们所说的脏读,两个并发事务,即“事务”。A:领导给singo“发工资”、“外遇”。B:singo查询薪资帐户“,事务处理B读取交易记录A尚未提交的数据。
设置隔离级别时Read uncommitted当发生读脏时,可能会发生读脏。如何避免读脏话,请看下隔离级别。
Read committed 读提交
singo拿着工资卡消费,系统读到卡上确实有2000元,而此时妻子也刚刚在网上转账,把singo工资卡的2000将人民币转到另一个账户并进入。singo该事务之前在以下情况下提交singo在扣除时,系统会检查singo工资卡没有钱,扣款失败,singo我想知道为什么我的卡里有钱。
出现上述情况,即我们所说的不可重复读取,两个并发的事务,“事务A:singo消费“,”交易B:singo网上转账的妻子“,风流韵事。A数据被提前读取,交易B立即更新数据并提交事务,事务A当再次读取数据时,数据已更改。
设置隔离级别时Read committed时,避免了脏读,但是可能会造成不可重复读取。
大多数数据库的默认级别为Read committed,比如Sql Server , Oracle。如何解决不可重复读取这一问题,请看下一个隔离级别。
Repeatable read 重复读
设置隔离级别时Repeatable read时,可以避免不可重复读取。当singo当您拿着工资卡消费时,一旦系统开始读取工资卡信息(即,交易开始),singo妻子不可能修改记录,也就是说。singo我妻子现在不能转账。
虽然Repeatable read避免了不可重复读取,但还有可能出现幻读。
singo我的妻子在银行部门工作,她经常通过银行的内部系统进行检查。singo信用卡消费记录。有一天,她在找singo当月信用卡消费总额(select sum(amount) from transaction where month = 本月)为80元,而singo这时,我正在外面吃着海塞,在收银台买单。1000元,就是增加了一个新的。1000人民币的消费记录(insert transaction … ),并提交交易,随后singo的老婆将singo打印了当月信用卡消费的详细信息A4纸,却发现总消耗量是1080元,singo我的妻子很惊讶,认为她有错觉,于是错觉就产生了。
注:MySQL默认隔离级别为Repeatable read。
Serializable 序列化
Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读取,还避免了幻像读。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门