MySQL的四种事务隔离级别

1、事务的基本要素(ACID)

  一、原子性(Atomicity):事务开始后全部操做,要么所有作完,要么所有不作,不可能停滞在中间环节。事务执行过程当中出错,会回滚到事务开始前的状态,全部的操做就像没有发生同样。也就是说事务是一个不可分割的总体,就像化学中学过的原子,是物质构成的基本单位。数据库

  二、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。好比A向B转帐,不可能A扣了钱,B却没收到。并发

  三、隔离性(Isolation):同一时间,只容许一个事务请求同一数据,不一样的事务之间彼此没有任何干扰。好比A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转帐。性能

  四、持久性(Durability):事务完成后,事务对数据库的全部更新将被保存到数据库,不能回滚。blog

2、事务并发时可能遇到的问题

  一、脏读:事务A读取了事务B更新的数据,而后B回滚操做,那么A读取到的数据是脏数据排序

  二、不可重复读:事务 A 屡次读取同一数据,事务 B 在事务A屡次读取的过程当中,对数据做了更新并提交,致使事务A屡次读取同一数据时,结果 不一致。事务

  三、幻读:系统管理员A将数据库中全部学生的成绩从具体分数改成ABCDE等级,可是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉同样,这就叫幻读。ci

  PS:不可重复读和幻读的区别,不可重复读侧重于修改形成的读取不一致,幻读侧重于新增或删除形成的读取不一致。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表。it

3、MySQL事务隔离级别

 

  一、未提交读(Read Uncommitted):读取未提交的内容,也被称为脏读。事务隔离级别最低的一种,全部事务均可以看到其余未提交事务的执行结果。本隔离级别不多用于实际应用,由于它的性能也不比其余级别好多少。io

  二、已提交读(Read Committed):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它知足了隔离的简单定义:一个事务只能看见已经提交事务所作的改变。这种隔离级别可能出现不可重复读(Nonrepeatable Read)的问题,由于同一事务的其余实例在该实例处理期间可能会有新的commit,因此同一select可能返回不一样结果。table

  三、可重复读(Repeatable Read):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到一样的数据行。不过这依然存在另外一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另外一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的行出现,好像出现了幻觉,所以叫“幻读”。InnoDB和Falcon存储引擎经过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

  四、可串行化(Serializable)这是最高的隔离级别,它经过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每一个读的数据行上加上共享锁。在这个级别,可能致使大量的超时现象和锁竞争。

相关文章
相关标签/搜索