SQL隔离级别趣谈邻里关系

SQL隔离级别趣谈

SQL隔离级别主要有4个级别:
    read uncommitted(未提交读)
    read committed(提交读)
    repeatable read(可重复读)
    serializable(可串行化)
    最近在学习sql性能调优方面的知识,这里对sql的隔离级别做一个简单的回顾,也是希望能用简单生动的语言让那些和我一样是初学者的人能更理解这个东西。
    我个人把sql的隔离级别理解为是为了能让事务内及事务间按照选定的规则更“和谐”的进行交互,不至于乱成一锅粥。就好比一个事务相当与一个家庭,规定的隔离级别一方面能让家庭的成员更好的享用同一个空间,一方面则规定了邻里见的交往方式。适当的时候选对了隔离级别,则可以让事务间礼貌友好的交往,不然则可能出现一些不可估量的错误。
  1. read uncommitted

         在该级别内,事务中的修改,即使没有提交,对于其他的事务都是可见的。简单来说,某个家庭的做的所有事对于邻里都是公开的,没有隐私可言。我可以随时知道你们家现在在干什么,存折有多少钱。但是这样很容易出现一个问题,就是“脏读”,即有可能两次访问某个数据前后不同,但是数据库的数据却还是原来的数据,即读取到错误的数据。导致这个现象的发生主要是由于被访问事务发生回滚,导致读取到了未提交及数据库的数据。
        这种现象很容易照成邻里矛盾,比如我明明没有中大奖,邻居却一直以为我中奖了差不多。
    
  2. read committed

        一个事务开始时,只能看见已经提交的事务所做的修改。就有点像某家人一直吹嘘儿子多厉害多厉害,考上了什么好大学,其实周围的人都不相信,只有当这家人那着录取通知书给邻居看时,他们才相信,才会在聊天的时候说到这家人的儿子多出息什么的。然而这种级别的隔离虽然解决了脏读的现象,却存在“不可重复读”和“幻读”。
        不可重复读即某事务两次读取到的数据由于其他事务的提交导致数据不一致。
        幻读是指某个事务在读取修改某个范围的数据时,另一个事务在插入一个新的数据出现的现象。意思大概就是,某个事务在修改某个范围内的数据,这时候另外一个事务往该范围内加入了一个新的数据,当第一个事务再次查询时,发现本来应该都被修改的范围内的数据多了一个没有被修改的,就像幻觉一样。
        好比某家在扫门前的院子,按照从左到右很认真的扫过去,结果邻居的小孩调皮的丢了个瓶子在扫过去的地方,等他扫完回头看,发现扫过的地方又有了垃圾,明明已经扫干净了的,幻觉一样。
    
  3. read repeatable

        可重复读只要是锁定某事务访问的数据行,从而时得其他事务不能对该数据进行任务提交性的修改,该加锁的阶段直到事务提交或者回滚。也就是这样,解决了“不可重复读”的现象,然而依旧存在“幻读”。因为另外事务insert的数据并没有被上一个事务加锁。
        该级别是mysql的默认级别。
    
  4. serializable

        串行化,即通过强制事务串行执行,避免了前面所提及由于事务并发导致的所有不良现象。实际上也是通过加锁的原理来解决的。
        但由于此级别的隔离对于任何事务的操作都要进行加锁等操作,实际上很容易出现超时及锁争用的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值