重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言
成都创新互联公司是一家集网站建设,伊美企业网站建设,伊美品牌网站建设,网站定制,伊美网站建设报价,网络营销,网络优化,伊美网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。提起数据库的事务,我们就会想到ACID特性:
A:Atomicity 原子性 事务中包含的各种操作,要么一起成功,要么全部失败
C:Consistency 一致性 事务从一个一致性的状态转变成另一个一致性的状态
I:Isolation 隔离性 各个事务之间的可见程度
D:Durability 持久性 数据库中的数据的改变应该是可以持久存储的
本篇博客将以MySQL为例分析数据库的读一致性。想分析清楚一致性,必先了解隔离级别。
数据库的隔离级别
在SQL标准中是定义了几种隔离级别的: RU:Read Uncommitted(读取未提交内容) RC:Read Committed(读取提交内容) RR:Repeatable Read(可重读) Serializable(可串行化) Serializable这种隔离级别高,若几个事务对同一份数据进行操作(即便是查询操作),它也针对每一个事务进行排序,严格按照排序进行事务的执行,显然解决了事务可能存在的冲突,但是会导致大量的超时以及锁竞争,因此在实际中大多是不会采用此种隔离级别的。 Oracle默认的隔离级别是:RC,并且Oracle只支持RC和Serializable这2种级别。RC,简单一句话,就是一个事务中只能看到另一个事务已经提交的数据的改变。那么RC会带来什么问题呢?在同一事务中,同一条SELECT语句可能会返回不一样的结果,即会产生 不可重复读。 MySQL默认的隔离级别是:RR。在该隔离级别下,可以保证在同一事务中,获取到的数据一致。这就是所谓的MySQL的读一致性,它的实现基于MVCC,后文中会分析。 RU可以让所有事务都读取到其他事务未提交的数据,会带来 脏读,同Serializable一样,在实际中,应用较少。 |
浅析MySQL MVCC原理
MVCC(MultiVersion Concurrency Control )多版本并发控制,可以简单的理解成为一个row lock的一个变种,只是在必要的时候加行锁。MySQL InnoDB的MVCC简单来讲是通过给表添加两列隐藏列来是实现的。一列是insert/update的时间,另一列是delete的时间,当然这里的时间并不是真正的时间,而是指SVN,即System Version Number,系统版本号,就是一个数字。每次开启一个事务,那么SVN号递增。 现在讨论在REPEATABLE READ下的MVCC实现: SELECT
只有记录满足以上两条,才会被select语句返回! 这就是为何MYSQL在RR级别下,一个事务中是肯定读取不到“之后建立的”别的事务提交的数据,但是在本事务中更新的数据,可以读取出来的缘故! INSERT
DELETE
UPDATE
这样设计的优点是大部分的读操作都不用加锁了,而且是非阻塞的读取操作,使数据库操作简单,性能好,不足之处是增加了存储开销,需要额外的维护工作。 还是那句老话,用空间换取时间! |
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。