事务的隔离级别

事务(Transaction)的隔离级别

多个用户“同时”操作同一个资源的时候,表现为互相之间是互不干扰的。这句话是事物的隔离性追求的理想。但是实际上,如果精度够高,这个现象是永远达不到的。(时间精度上,空间精度上)。所以,如果要追求真正的隔离性,实际上是以牺牲并发性为代价的。所以SQL标准制定了隔离级别(isolation level)。越追求隔离性,代表数据越正确,越追求并发性,性能更高。

  1. 可串行性(serializable):一个接一个的去执行。每个事务必须排队,一次一条事务。
  2. 可重复读 (repeatable):保证了再一次事务过程中,(只要没有提交或回滚),看到的值是不会变化的(即使有别的事务对这个数据做过修改,并且已经提交了)。此时如果要读取修改后的数据,就要在开启一个新的事务去读取修改后的数据。
    传统意义上的可重复读仍有一个副作用叫“幻读”。比如,表里有十条数据,这个时候对表中的十条数据做个update,此时在表中在插入一条新的数据,这个时候查询这个表格的数据,应该看到表中的所有数据被修改,但是select后,并没有看到所有数据被修改,而是出现了一条“幽灵般的数据”没有被修改。这种现象称“幻读”。也就是说,可重复读,只对表中的原有的数据做保护和修改,新插入的数据是没有被修改的。
  3. 读已提交 (read committed):可以看到别人已经提交的修改数据。这个是比较好理解的,别人提交前无法读取,别人提交修改数据后,就可以读取修改数据了。此时,假设T1事务未修改数据前a=1 ,那么T2事务读取到的一直是a=1,当T1事务提交修改数据a=10后,T2事务读取到a=10了,这个时候T2事务已经意识到又别的事务在修改数据了。称“不可重复读”。
    这个级别的副作用:不可重复读,没有脏读了。
  4. 读未提交(read uncommitted):完全没有隔离性。多个同时在执行的事务,可以读取到(看到)其他事务,还处于事务未提交时的数据修改。为了追求性能,在别人未提交修改之前,就可以读取到未提交的数据修改。但是这个修改是临时的修改,随时可能被回滚,很有可能破坏了一致性。这种操作被称,读取到了“脏数据”,又称为“脏读”。这个级别里,也存在不可重复读现象。

实际上,近几年有一个叫快照读(snapshot read)的级别,介于可串行性和可重复读之间,但是还没有纳入标准,可作为拓展了解。这个级别可以说基本不存在副作用,做到了连“幻读”这个副作用都不存在。

MySQL中的默认情况下,隔离级别就是可重复读。

存在即合理,每一种隔离级别的存在都有它的意义所在。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值