首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

单机中数据库的事务与隔离级别

一、事务

事务是数据库操作的基本单位,事务具有ACID的特性:

A:Atomicity(原子性):一个事务中的操作,要么全部被执行,要么全部不被执行。

C:Consistency(一致性):这里的一致性不同于分布式CAP理论中的Consistency一致性,数据库事务的一致性指的是事务要保证数据类型必须正确,数值必须在规定的范围之内等等。

I:Isolation(隔离性):隔离性指的是,任何事务的中间状态对其他事务都是不可见的,其他事务不应该读取到一个处于该事务中间状态的值。

D:Durability(持久性):指的是事务完成之后,对于数据库的影响应该是永久的。(永远生效)

但是,出现了一个问题,当并发度很高的情况下,事务的隔离性就不好了,有时会出现一个事务读取到另外一个事务的中间状态的情况。所以,出于性能的考虑,数据库允许牺牲一部分隔离性来保证高并发。因此,对隔离性划分了不同的级别,称为隔离级别。

二、隔离级别:

提前先说一点,虽然允许牺牲部分隔离性来保证并发,但是,底线就是:“我写的时候你不能写”。如果事务A刚对某一行改完,事务B也改了这一行,那么事务A更改的这一行就被覆盖了。称为更新丢失。隔离性的底线就是确保更新不能丢失。

在保证了“我写的时候你不能写”的前提下,那么“我读的时候呢?”。。。分不同的隔离级别来讨论吧。

这里按照隔离级别从弱到强来讲:

1)最弱的隔离级别叫做读未提交(Read Uncommitted):指的是“我读的时候你可以写,并且你写的还没提交我就能看到”。比如事务A在读某一条记录x=1,此时事务B更改了x的值,虽然事务B还未结束还未提交,但是事务A读到的就是x的最新的值。事务A读到其他事务还未提交的值,称为脏读。脏读说明了一个事务的内部的信息是不能被其他事务看到的。

2)第二弱的隔离级别叫做提交读(Read Committed):指的是“我读的时候你可以写,但是你的事务未提交我就读不到,你的事务提交之后我会读到你写的”。比如说事务A读取x的值,此时事务B中修改了x的值,但是事务B还未提交,此时事务A就读不到x被B修改后的值。若是事务B提交了,那么事务A可以读到事务B修改后的x的值。在这个隔离级别中,虽然解决了脏读问题,但是事务A在事务B提交前和提交之后两次读取到的值可能是不同的,这种问题叫做不可重复读。

3)第三弱的隔离级别叫做可重复读(Repeatable Read):顾名思义,它解决了重复读取读到的值不一样的问题。指的是“我读的时候,你不能写!”,那么当事务A读取x的值的时候,事务B不允许更新(update)或者删除(delete)x,那么当然可以保证事务A读取的x的值不变啦。在这个隔离级别中,虽然解决了不可重复读问题,但是,还没有解决幻读的问题。那么什么是幻读呢?就是说事务A读取x的值的时候,事务B不允许更改和删除操作,但是事务B可以执行插入操作。比如事务B插入了y,那么虽然事务A读取到的x的值不变,但是会多读到一个y。

4)最强的隔离级别叫做为可序列化(Serializable):指的是“我读的时候你不能写,连插入也不行!”。这样的话,事务就仿佛是顺序执行的一样,几乎完全没有并发。

三、总结:

1)可序列化解决了幻读问题,不可重复读问题,脏读问题

2)可重复读解决了重复读问题(确保两次读到的内容一样),脏读问题

3)提交读解决了脏读问题

4)所有的隔离级别都解决了更新丢失问题(不允许同时写)

四、常见数据库的默认隔离级别

1)MySQL的默认隔离界别是第二强的可重读读。

2)Oracle的默认隔离级别是第三强的读已提交。

3)SQL Server的默认隔离级别也是第三强的读已提交。

从默认来看,MySQL的隔离性更强。

MySQL中查看默认隔离级别的语句:select @@tx_isolation;

最后说一句,隔离级别和并发性永远是一个权衡问题。隔离级别高的话并发就差,并发高的话隔离级别就差,所以究竟如何,还要根据具体的业务来权衡。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180315G1RZI700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券