数据库事务的四种隔离级别

吐槽一下,最近真的是太忙了,又得准备面试找工作,又得准备六级,还得做学校的科研项目,还得做目前的学习项目,总之,一头雾水。

今天来总结一下数据库事务的四种隔离级别,对自己的知识做一个梳理总结;

数据库隔离级别分为四种:

  1. read-uncommitted
  2. read-committed  
  3. repeatable-read 
  4. serializable    

下面分别来介绍:

1.read-uncommitted:从英文的字面意思来理解就是(读-未被提交的数据)uncommitted有被动的意思,这个事务的隔离级别呢就是,你能读取到别人没有提交的数据;

举个例子:这里有一张账户表,是你女朋友的账户哦!

 比如:你今天很开心,打算给女朋友1000块钱零花钱,但是你一不小心手多摁了个0变成了10000,相当于你执行这样一条sql语句(update account set balance = 10000 where id = 1),就在这时你女朋友查看了一下自己的余额,发现有10000块,很激动;此时,你发现不对劲,发现多摁了个0,赶紧执行了rollback语句,此时,你女朋友余额变为0,这时女朋友兴高采烈的打过来电话告诉你,我卡里多了一万块钱;你笑着说,你再看一次;她发现变成了0,然后变得很不开心;

你女朋友查看到自己有一万块的这个过程就叫:读到了你未提交的数据。 

产生的问题:这个事务伴随而来的问题就是产生了脏读的问题;


2.read-committed:从英文的字面意思理解就是(读-提交了的数据)committed被提交的意思,这个事务的隔离级别就是,你只能读到别人提交了的数据;

举个例子:女朋友拿到了你给的一千块钱零花钱,说终于能买下自己在购物车里躺了好久的漂亮衣服了,于是就打开某宝,准备付款了(产生了一个事务在操作当前的1000),又犹豫了会儿;就在这个时候,你的好哥们和你说,江湖救急啊,快借我1000块,你无奈只能将女朋友账户的一千块借了出去(此时,有一个新的事务操作了这个1000,两个事务同时操作,女友的付款只能等待你的事务提交之后再执行);就在女友准备支付了,发现余额不足了,然后又变得很不开心;

你女朋友付款只能等待你的事务结束的这个过程就叫做:只能读取到你提交了的数据。

解决的问题:解决了脏读,因为是提交以后才能读取到,自然不会产生脏读;

带来的问题:不可重复读,女朋友付款之前还是1000,付款时就变成了0,两次读取的结果不一样,就是不可重复读的问题;


 3.repeatable-read: 还是从英文字面理解意思是(可重复读)-able结尾的代表有什么什么的能力,这个事务的隔离级别就是,你可以多次读取一个数据,而且在你读取的过程中,值不会发生改变;

举个例子:你又发工资了,把一千块钱给了女朋友,女朋友心想,终于能买衣服了,打开某宝,但是女朋友还是不放心你,非得在他买衣服的过程中看住你(相当于数据库使用repeatable-read这个事务隔离级别),女友顺利的买下了心爱的衣服;奈何她怎么能看的住一个程序猿呢,就在女朋友付款的同时(付款事务已经产生),你用高深的手段在女友的购物车中添加了一个200块钱的内存条;女友惊讶道:明明我的衣服是八百块钱,为什么扣了我1000块钱,然后查看自己的购物信息,发现多了一个内存条的信息,感觉自己产生了幻觉;

解决的问题:解决了脏读和不可重复读的问题,repeatable-read这个事务隔离级别,在事务产生之后,就不允许另一个事务进行操作该数据了;

带来的问题:幻读,女朋友在结算的时候,你神出鬼没的添加了一条数据,让女友产生了幻读;


4.serializable:英文意思为序列化的,这是数据库事务的最高隔离级别,这个事务的隔离级别,就是操作一个数据的事务只能一个执行完,另一个事务才能产生

举个例子:经过了这几次的曲折离奇之后,女朋友再也不相信你,在她买东西的时候,非得把你的手机没收了,她买完之后,再把手机给你,你再买(顺序执行,一个结束之后,另一个开始

解决的问题:serializable可以解决之前所有隔离级别产生的问题,就因为它的顺序执行;

产生的问题:顺序执行,也因此呢,使用这个隔离级别,数据库处理数据的效率会变的底下,毕竟鱼与熊掌,不可兼得;


注意:

  1. 级别越高解决的问题越多但是效率越低。
  2. 并不是所有数据库都支持这四种事务隔离级别,比如oracle就只支持第二种和第四种这俩种,比如mysql就四种全支持.
  3. oracle里面默认的事务隔离级别是第二种:read-committed

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值