首页 / MYSQL / Mysql事务隔离机制
Mysql事务隔离机制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Mysql事务隔离机制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5558字,纯文字阅读大概需要8分钟。
内容图文
Mysql事务隔离机制
- 什么是数据库事务,特性,隔离级别,每个隔离级别能解决什么问题?
(1)数据库事务
事务是并发控制的基本单位,就是将为了完成一个独立功能的一系列的语句封装起来。
(2)事务的特性(ACID)
原子性(Atomicity):事务是一个整体的工作单元,事务中对数据库的操作要么全部成功,要么全部失败。失败回滚的操作事务,将不能对事务有任何影响。
一致性(Consistency):当事务完成以后,必须使得所有的数据状态都要保持一致。
隔离性(Isolation):是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。事务和事务之间是相互独立存在,事务不能去操作别的事务正在修改的数据。
永久性(Durability):当事务完成以后,对数据所做的修改会永久保存下来,不能进行撤销。
(3)事务的并发问题
脏读:就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,发生了幻读。
不可重复读的和幻读的区分:不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
(4)事务的隔离级别
事务的隔离级别从低到高分别是:读未提交(Read uncommitted),读已提交(Read committed),可重复读(Repeatable read ),串行化(Serializable),这四个隔离级别可以分别解决脏读,不可重复读,幻读的问题。
读未提交(Read uncommitted):事务commit后才会更新到数据库,采用读未提交隔离级别,数据库中的数据并没有改变,因此此隔离级别没有作用。
读已提交(Read committed):只能解决脏读的问题。
可重复读(Repeatable read ):每次读取的结果集都相同,而不管其他事务有没有提交,可以解决脏读和不可重复读。
串行化(Serializable):串行化是4种事务隔离级别中隔离效果最好的,解决了脏读、可重复读、幻读的问题,但是效果最差,它将事务的执行变为顺序执行,与其他三个隔离级别相比,它就相当于单线程,后一个事务的执行必须等待前一个事务结束。mysql中事务隔离级别为serializable时会锁表,因此不会出现幻读的情况,这种隔离级别并发性极低,开发中很少会用到。
SQL 标准定义了四种隔离级别,mysql全都支持,mysql默认的隔离级别是:可重复读。
oracle中只支持2个隔离级别:读已提交和串行化,默认是读已提交。
- 不可重复读、幻读 ?两者区别?MySQL如何解决?
可重复读(RR)隔离级别只能解决部分幻读的问题。
例如:出现幻读的情况
开启T1事务,然后查询数据
开启事务T2,插入一条数据,提交事务
回到事务T1,执行刚才的查询,发现T2插入的数据不存在,幻读没有发生
T1事务里面,修改刚才插入的数据
再次执行T1的查询,发现T2的数据出现了,幻读发生了
为了解决不可重复读,或者为了实现可重复读,MySQL 采用了 MVVC (多版本并发控制) 的方式。
MySQL 已经在可重复读隔离级别下解决了幻读的问题。由于并发写问题的解决方式就是行锁,也叫记录锁,而解决幻读用的也是锁,叫做间隙锁,MySQL 把行锁和间隙锁合并在一起,解决了并发写和幻读的问题,这个锁叫做 Next-Key锁。next-key锁包含了记录锁和间隙锁,即锁定一个范围,并且锁定记录本身,Mysql的InnoDB存储引擎的默认加锁方式是next-key 锁,next-key锁锁定的范围为间隙锁+记录锁,例如select * from news where number=4 for update ,区间(2,4),(4,5)加间隙锁,同时number=4的记录加记录锁。
(1)事务隔离级别为读提交时,写数据只会锁住相应的行。
(2)事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
(3)事务隔离级别为串行化时,读写数据都会锁住整张表。
(4)隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
- MySQL MVCC(Multi-Version Concurrency Control)机制
MySQL的并发控制有三种常见的机制:悲观控制、乐观控制和多版本控制,其中悲观并发控制其实是最常见的并发控制机制,也就是锁,分为行级锁和表锁,行级锁又分为共享锁和排它锁,事务其实是并发控制的基本单位,事务的隔离性是数据库处理数据的几大基础之一,分为脏读、不可重复读、可重复读、串行化,MySQL通过隔离性和锁来控制事务并发的可靠性。
MVCC是一种多版本并发控制机制。在MySQL中,MVCC只在读取已提交(Read Committed)和可重复读(Repeatable Read)两个事务级别下有效。我们都知道锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,降低其系统开销。
MVCC的实现:MVCC是通过保存数据在某个时间点的快照来实现的, 不同存储引擎的MVCC实现是不同的。
- MyISAM和InnoDB?
(1)MyISAM是MySQL关系数据库管理系统的默认储存引擎。这种MySQL表存储结构从旧的ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事务,参照完整性,以及更高的并发性等优点开始广泛的取代MyISAM。每一个MyISAM表都对应于硬盘上的三个文件。这三个文件有一样的文件名,但是有不同的扩展名以指示其类型用途:.frm文件保存表的定义,但是这个文件并不是MyISAM引擎的一部,而是服务器的一部分;.MYD保存表的数据;.MYI是表的索引文件。
(2)InnoDB是MySQL的另一个存储引擎,正成为目前MySQL AB所发行新版的标准,被包含在所有二进制安装包里。较之于其它的存储引擎它的优点是它支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(即对外键的支持)。
(3)目前比较普及的存储引擎是MyISAM和InnoDB,而MyISAM与InnoDB的主要的不同点在于性能和事务控制上。如果你的应用是不需要事务,处理的只是基本的CRUD操作,MyISAM是绝大部分Web应用的首选。InnoDB被设计成适用于高并发读写的情况,使用MVCC(Multi-Version Concurrency Control)以及行级锁来提供遵从ACID的事务支持。InnoDB的设计目标是处理大容量数据库系统,它的CPU利用率是其它基于磁盘的关系数据库引擎所不能比的,使用InnoDB可以应对更为复杂的情况,特别是对并发的处理要比MyISAM高效。
内容总结
以上是互联网集市为您收集整理的Mysql事务隔离机制全部内容,希望文章能够帮你解决Mysql事务隔离机制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。