MySQL事务隔离级别详解
详解MySQL的事务以及隔离级别
详解MySQL的事务以及隔离级别
楔子
本次来聊一聊事务,首先事务一般指的是逻辑上的一组操作,或者作为单个逻辑单元执行的一系列操作。同属于一个事务的操作会作为一个整体提交给系统,这些操作要么全部执行成功,要么全部执行失败。
下面就简单地介绍一下事务的特性。
事务的特性
总体来说,事务存在四大特性,分别是原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),因此事务的四大特性又被称为 ACID。
原子性:
事务的原子性指的是构成事务的所有操作要么全部执行成功,要么全部执行失败,不会出现部分执行成功,部分执行失败的情况。
例如在转账业务中,张三向李四转账100 元,于是张三的账户余额减少 100 元,李四的账户余额增加 100 元。在开启事务的情况下,这两个操作要么全部执行成功,要么全部执行失败,不可能出现只将张三的账户余额减少100 元的操作,也不可能出现只将李四的账户余额增加 100 元的操作。
一致性:
事务的一致性指的是事务在执行前和执行后,数据库中已存在的约束不会被打破。
比如余额必须大于等于 0 就是一个约束,而张三余额只有 90 元,这个时候如果转账100 元给李四,那么之后它的余额就变成了-10,此时就破坏了数据库的约束。所以数据库认为这个事务是不合法的,
因此执行失败。
隔离性:
事务的隔离性指的是并发执行的两个事务之间互不干扰,也就是说,一个事务在执行过程中不会影响其它事务运行。
持久性:
事务的持久性指的是事务提交完成后,对数据的更改操作会被持久化到数据库中,并且不会被回滚。
mysql数据库实例默认隔离级别
MySQL数据库实例默认隔离级别
1. 什么是隔离级别?
在多用户并发访问数据库的情况下,为了保证数据的一致性和事务的正确执行,数据库管理系统(DBMS)采用了隔离级别(Isolation Level)的概念。隔离级别定义了一个事务与其他事务之间的可见性和影响范围。
MySQL数据库提供了四个标准的隔离级别,分别为: - 读未提交(Read Uncommitted) - 读已提交(Read Committed) - 可重复读(Repeatable Read)- 串行化(Serializable)
2. MySQL数据库实例的默认隔离级别
MySQL数据库默认采用的是可重复读(Repeatable Read)隔离级别。这意味着当一个事务开始时,它所看到的数据是一致且不变的。在该隔离级别下,一个事务只能看到在它开始之前已经提交或回滚的数据。
3. 可重复读隔离级别特点
3.1 并发控制
可重复读隔离级别通过使用锁来实现并发控制。当一个事务执行时,会对其涉及到的数据行进行加锁,其他事务在访问被锁定的数据行时需要等待。
3.2 一致性读
在可重复读隔离级别下,同一个事务中的所有查询都会返回相同的结果,即使其他事务对数据进行了修改。这是因为MySQL数据库在可重复读隔离级别下使用了多版本并发控制(MVCC)机制。
3.3 防止脏读和不可重复读
可重复读隔离级别可以防止脏读和不可重复读的问题。脏读是指一个事务在未提交之前,另一个事务就能够看到它所做的修改。不可重复读是指在同一个事务中,两次查询相同的数据却返回了不同的结果。
数据库事务处理中的隔离级别详解(七)
数据库事务处理中的隔离级别详解
概述:
数据库事务是指将一系列数据库操作(如插入、更新、删除等)
作为一个整体进行处理的过程,这样可以确保数据的一致性和完整性。在多用户同时操作数据库的环境下,为了解决并发访问可能造成的数
据问题,数据库中引入了隔离级别的概念。本文将详细介绍数据库事
务处理中的隔离级别。
一、隔离级别的定义:
在数据库事务处理中,隔离级别指的是并发执行的事务彼此之间
的可见性。不同的隔离级别对事务之间的可见性有不同的限制,从而
保证数据库在并发访问时的数据一致性。
二、事务的基本特性:
在讨论隔离级别之前,我们先了解一下事务的四个基本特性,即
原子性、一致性、隔离性和持久性。
1. 原子性(Atomicity):事务不可分割。要么所有操作都执行
成功,要么所有操作都回滚到事务开始前的状态。
2. 一致性(Consistency):事务执行结束后,数据库应保持一
致性状态。
3. 隔离性(Isolation):并发执行的事务之间应该相互隔离,
互不干扰。
4. 持久性(Durability):事务一旦提交,其所做的修改将永久保存在数据库中。
三、隔离级别的详解:
在数据库管理系统中,通常有四种隔离级别,分别是读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。随着隔离级别的升高,数据一致性得到了保障,但同时也会降低数据库的并发性能。接
下来将详细介绍每个隔离级别的特点。
1. 读未提交:
在这个隔离级别下,一个事务对某行数据的修改,即使没有提交,其他事务也可以读到已经修改的数据。读未提交的隔离级别最低,可
Mysql事务隔离级别和传播机制
Mysql事务隔离级别和传播机制
Mysql事务隔离级别和传播机制
⼀、事务的特性(ACID)
1. 原⼦性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执⾏过程中出错,会回滚
到事务开始前的状态,所有的操作就像没有发⽣⼀样。也就是说事务是⼀个不可分割的整体,就像化学中学过的原⼦,是物质构成的基本单位。
2. ⼀致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。⽐如A向B转账,不可能A扣了钱,B却没收到。
3. 隔离性(Isolation):同⼀时间,只允许⼀个事务请求同⼀数据,不同的事务之间彼此没有任何⼲扰。⽐如A正在从⼀张银⾏卡中取
钱,在A取钱的过程结束前,B不能向这张卡转账。
4. 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。
⼆、事务的并发问题
1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
2. 不可重复读:事务 A 多次读取同⼀数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同⼀数据
时,结果不⼀致。
3. 幻读:系统管理员A将数据库中所有学⽣的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插⼊了⼀条具体分数的
记录,当系统管理员A改结束后发现还有⼀条记录没有改过来,就好像发⽣了幻觉⼀样,这就叫幻读。
⼩结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满⾜条件的⾏,解决幻读需要锁表
mysql 数据库默认隔离级别
mysql 数据库默认隔离级别
MySQL数据库默认隔离级别是指在没有显式指定隔离级别的情况下,MySQL数据库使用的默认隔离级别是什么。隔离级别是指数据库管理系统允许的并发操作之间的隔离程度,它决定了一个事务对其他事务的可见性和影响范围。
在MySQL数据库中,默认的隔离级别是可重复读(REPEATABLE READ)。可重复读是指在一个事务中,如果数据在事务开始时被读取,则在整个事务期间,无论其他事务对数据进行了何种修改,读取的结果都将保持一致。这意味着在一个事务中,读取的数据不会受到其他事务的影响,保证了数据的一致性。
在可重复读隔离级别下,MySQL数据库使用了多版本并发控制(MVCC)来实现事务的隔离。MVCC通过在数据库中保存数据的多个版本来实现事务的隔离,每个事务只能看到它开始时的数据版本。这样可以避免了读取未提交的数据和不可重复读的问题。
在可重复读隔离级别下,MySQL数据库使用了一些机制来实现事务的隔离。其中主要的机制包括:
1. 读取一致性视图:每个事务开始时,会创建一个读取一致性视图,该视图包含了事务开始时数据库中的数据版本。在事务执行期间,只能看到该视图中的数据,而不会看到其他事务对数据所做的修改。
2. 间隙锁:当一个事务执行范围查询时,MySQL数据库会对查询的范围中不存在的数据进行间隙锁定,以防止其他事务在范围中插入数据。
3. 快照读:当一个事务执行读取操作时,MySQL数据库会使用数据的历史版本来执行读取操作,而不是使用当前的数据版本。这样可以避免读取已经被其他事务修改的数据。
sql标准中事物的四种隔离级
sql标准中事物的四种隔离级
SQL标准中事务的四种隔离级别,按照严格度从低到高依次为:
1. 读未提交(Read Uncommitted):最低的隔离级别,事务可
以读取其他事务尚未提交的数据。可能导致脏读(Dirty Read)问题。
2. 读已提交(Read Committed):在一个事务中,只能读取已
经提交的数据。避免了脏读问题,但可能出现不可重复读(Non-repeatable Read)问题。
3. 可重复读(Repeatable Read):一个事务在执行期间多次读
取同一数据时,结果保持一致。避免了脏读和不可重复读问题,但可
能出现幻读(Phantom Read)问题。
4. 串行化(Serializable):最高的隔离级别,确保每个事务
都完全独立执行,避免了脏读、不可重复读和幻读问题。但会带来较
高的并发性能开销。
这四种隔离级别提供了不同的权衡,根据应用场景和需求选择适
当的隔离级别。
oceanbasemysql 事务默认隔离级别-定义说明解析
oceanbasemysql 事务默认隔离级别-概述说明以
及解释
1.引言
1.1 概述
事务是数据库管理系统(DBMS)中的一个重要概念,它用来保证数据库操作的一致性和可靠性。事务的概念最早由电子商务领域提出,其目的是确保在数据库操作过程中数据的完整性和正确性。
MySQL数据库是目前最受欢迎的关系型数据库之一,它提供了强大的事务支持。事务隔离级别是指在并发执行的多个事务之间,各个事务所见到的数据的一致性问题。在MySQL中,事务隔离级别可以根据应用的需求进行设置。
事务隔离级别的选择非常重要,它直接影响到数据库的并发性和数据一致性。不同的隔离级别对事务的并发控制和资源管理有不同的影响。MySQL默认的事务隔离级别是可重复读(REPEATABLE READ)。
本文的主要目的是探讨oceanbasemysql默认的事务隔离级别,并分析该隔离级别对数据库操作的影响。通过对其特点和优劣势的介绍,旨在给读者提供关于事务隔离级别选择的最佳实践和建议。
总结起来,本文将从概述MySQL数据库的事务支持开始,重点分析事务隔离级别的重要性,并探讨oceanbasemysql的默认隔离级别以及对事务操作的影响。最后,我们将给出一些建议和最佳实践,帮助读者在实际应用中选择和设置合适的事务隔离级别。
文章结构部分的内容可以包括以下内容:
在本篇文章中,将会探讨oceanbasemysql的事务默认隔离级别。本文将按照以下结构展开:
1. 引言
1.1 概述:介绍oceanbasemysql作为一个关系型数据库管理系统,在处理事务时所支持的隔离级别的重要性。
mysql5.5默认隔离级别
mysql5.5默认隔离级别
在MySQL 5.5 中,事务的默认隔离级别是REPEATABLE READ(可重复读)。这是因为MySQL 5.5 默认使用InnoDB 存储引擎,而InnoDB 存储引擎的默认隔离级别就是REPEATABLE READ。
REPEATABLE READ 隔离级别的特点是在整个事务生命周期内,同一事务的多次读取将会看到相同的数据快照,而不受其他并发事务的影响。这可以提供一定程度的数据一致性,但可能会导致一些并发性能问题。
在MySQL 中,可以通过以下SQL 语句来查询当前数据库的隔离级别:
```sql
SELECT @@tx_isolation;
```
如果想要在事务中设置不同的隔离级别,可以使用`SET TRANSACTION` 语句。例如,将隔离级别设置为READ COMMITTED:
```sql
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
```
请注意,MySQL 的隔离级别可能因为不同的存储引擎而有所不同,而InnoDB 是MySQL 中较为常用的存储引擎之一。如果你在使用其他存储引擎,建议查阅相应的文档以确认默认隔离级别。
oracl mysql sqlserver 默认隔离级别
Oracle、MySQL和SQL Server的默认隔离级别分别是:
1. Oracle:默认支持READ COMMITTED和SERIALIZABLE这两种事务隔离级别。
2. MySQL:默认事务隔离级别是可重复读取(REPEATABLE READ)。
3. SQL Server:默认事务隔离级别是提交读取(READ COMMITTED)。
可以通过设置语句来改变这些数据库的隔离级别。
事务的隔离级别,mysql默认的隔离级别是什么?
事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),⼀个事务可以读取另⼀个未提交事务的数据,最低级别,任何情况都⽆法保证。
(1)所有事务都可以看到其他未提交事务的执⾏结果
(2)本隔离级别很少⽤于实际应⽤,因为它的性能也不⽐其他级别好多少
(3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据
读已提交(Read committed),⼀个事务要等另⼀个事务提交后才能读取数据,可避免脏读的发⽣。
(1)这是⼤多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满⾜了隔离的简单定义:⼀个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同⼀个事务中执⾏完全相同的select语句时可能看到不⼀样的结果。
|——>导致这种情况的原因可能有:(1)有⼀个交叉的事务有新的commit,导致了数据的改变;(2)⼀个数据库被多个实例操作时,同⼀事务的其他实例在该实例处理其间可能会有新的commit
可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发⽣。
(1)这是MySQL的默认事务隔离级别
(2)它确保同⼀事务的多个实例在并发读取数据时,会看到同样的数据⾏
(3)此级别可能出现的问题——幻读(Phantom Read):当⽤户读取某⼀范围的数据⾏时,另⼀个事务⼜在该范围内插⼊了新⾏,当⽤户再读取该范围的数据⾏时,会发现有新的“幻影” ⾏
数据库的四种隔离级别
数据库的四种隔离级别
1.前言
数据库隔离级别是指在数据库多用户并发操作时,控制事务之间不会产生干扰并保障数据的完整性和一致性的一种机制。目前,数据库通常提供四种隔离级别,分别是未提交读(Read uncommitted)、提交读(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。
2.未提交读(Read uncommitted)
未提交读是最低的隔离级别,事务可以读取其他未提交的事务的数据。这种隔离级别可能会引起脏读、不可重复读和幻读的问题,因此不推荐使用。
3.提交读(Read committed)
提交读是默认的隔离级别,事务只能读取其他已经提交的事务的数据。这种隔离级别可以避免脏读的问题,但可能会出现不可重复读和幻读的问题。
4.可重复读(Repeatable read)
可重复读隔离级别保证在事务执行期间,多次读取同一数据行的结果都是一致的。这种隔离级别可以避免脏读和不可重复读的问题,但可能会出现幻读的问题。
5.串行化(Serializable)
串行化隔离级别是最严格的隔离级别,事务串行执行,其中一个事务在执行时其他事务不能执行。这种隔离级别可以避免所有并发问题,但会降低数据库的并发性能。
6.总结
选择合适的隔离级别需要考虑到并发性和数据一致性的平衡。在实际开发中,应该根据具体需求选择相应的隔离级别,以达到最优的性能和数据一致性。
MySQL中的事务处理和异常处理机制
MySQL中的事务处理和异常处理机制
在数据库管理系统中,事务处理和异常处理是非常重要的两个概念。MySQL
作为一种常用的关系型数据库管理系统,也提供了相应的事务处理和异常处理机制。
一、事务处理机制
事务是指一系列数据库操作的执行单元,要么全部成功执行,要么全部失败回滚。MySQL使用了ACID(原子性、一致性、隔离性、持久性)特性来保证事务
的正确执行。
1. 原子性(Atomicity):一个事务中的所有操作要么全部执行成功,要么全部
回滚,不存在部分执行的情况。
2. 一致性(Consistency):事务执行前后,数据库的数据必须保持一致。如果
事务执行出错导致数据不一致,必须回滚到事务开始前的状态。
3. 隔离性(Isolation):多个事务并发执行时,每个事务都必须与其他事务隔离,事务之间相互不干扰。MySQL提供了四种隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和
串行化(Serializable)。
4. 持久性(Durability):一旦事务提交,其修改的数据就会永久保存在数据库中,即使数据库发生故障也不受影响。
在MySQL中,通过以下语句来定义一个事务:
```
START TRANSACTION; -- 开始事务
SQL 语句...
COMMIT; -- 提交事务
ROLLBACK; -- 回滚事务
```
在事务中,可以执行多条SQL语句,并使用COMMIT语句将事务提交,或使用ROLLBACK语句将事务回滚。通过使用事务的方式,可以保证数据库操作的一致性和完整性。
MySQL中的事务隔离级别详解与应用场景
MySQL中的事务隔离级别详解与应用场景引言
MySQL是一款常用的关系型数据库管理系统(RDBMS),被广泛应用于各个行业的数据存储和管理。在数据库中,事务是一组数据库操作单元,具有原子性、一致性、隔离性和持久性(ACID)的特性。而事务隔离级别则决定了事务之间的隔离程度。本文将详细介绍MySQL中常用的事务隔离级别,并探讨它们在不同场景下的应用。
一、事务隔离级别的定义和分类
1.1 事务隔离级别的定义
事务隔离级别是定义多个并发事务之间相互隔离程度的方式。在MySQL中,共定义了四种事务隔离级别,分别为READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和SERIALIZABLE(可串行化)。
1.2 事务隔离级别的分类
事务隔离级别可分为两类:基于锁和基于多版本控制(MVCC)。基于锁的隔离级别是通过锁定读取和修改的数据来实现的,而基于MVCC的隔离级别是通过版本控制机制来实现的。MySQL的默认隔离级别是REPEATABLE READ,它是基于MVCC实现的。下面将逐一介绍各种隔离级别的特点和应用场景。
二、事务隔离级别的特点与应用场景
2.1 READ UNCOMMITTED(读未提交)
特点:事务中的修改即时对其他事务可见,事务之间没有隔离性。该隔离级别下,可能会出现脏读(读到未提交事务的数据)和不可重复读(同一条记录多次读取的结果不一致)的问题。
应用场景:适用于高并发读写场景要求速度优先而对数据的一致性要求较低的
数据库的四种隔离级别和解决的问题
数据库的四种隔离级别和解决的问题
读未提交隔离级别下,一个事务可以读取另一个事务未提交的数据,可能导致脏读问题。
读已提交隔离级别下,一个事务只能读取另一个事务提交的数据,避免了脏读问题,但可能会导致不可重复读问题。
可重复读隔离级别下,一个事务在执行期间多次读取同一数据,始终能够得到相同的结果,避免了不可重复读问题,但可能会导致幻读问题。
串行化隔离级别下,一个事务必须等待另一个事务执行完毕才能执行,避免了以上所有问题,但会导致性能下降。
因此,在选择隔离级别时,需要根据具体业务场景和性能需求进行权衡。
- 1 -
MySQL事务隔离级别详解资料
MySQL事务隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select 可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的
数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
mysql 默认的隔离级别
mysql 默认的隔离级别
MySQL中,默认隔离级别是可重复读(REPEATABLE READ)。在了解默认隔离级别之前,我们先来了解一下什么是隔离级别。
隔离级别是指多个事务同时操作相同数据时,如何对数据进行隔离,以避免出现问题。MySQL支持4种隔离级别,分别为读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。
读未提交:一个事务可以读取另一个事务还未提交的数据。这种隔离级别容易出现脏
读(Dirty Read),即读取到未提交的数据,可能导致数据不一致。
可重复读:一个事务开始之后,不论其他事务做的修改是否已经提交,本事务看到的
数据都是一样的。这种隔离级别可以避免不可重复读,但是可能会出现幻读(Phantom Read),即在一个事务中,同一查询语句两次执行的结果不一致。
串行化:一个事务在执行期间会对数据进行锁定,其他事务不能访问该数据。这种隔
离级别可以避免所有并发问题,但是在高并发环境下可能导致性能问题。
MySQL默认的隔离级别是可重复读,也是最常用的隔离级别。当启用可重复读隔离级
别时,使用select语句获取到的数据是事务开始执行时的状态。即使其他事务修改了同
样的数据,当前事务查询到的数据也不会受到影响。
在使用可重复读隔离级别时,需要注意以下情况:
1. 可能出现幻读。幻读指在一个事务中,同一查询语句两次执行的结果不一致,是
因为在两次执行之间有另一个事务插入了新数据。为了避免幻读,可以使用SELECT ... FOR UPDATE语句对查询结果进行加锁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MySQL事务隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例
在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon
存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:
脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:
下面,将利用MySQL的客户端程序,分别测试几种隔离级别。测试数据库为test,表为tx;表结构:
id int
num int
两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。
(一)、将A的隔离级别设置为read uncommitted(未提交读)
在B未更新数据之前:
客户端A:
B更新数据:客户端B:
客户端A:
经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。
(二)、将客户端A的事务隔离级别设置为read committed(已提交读)在B未更新数据之前:
客户端A:
B更新数据:客户端B:
客户端A:
经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。
(三)、将A的隔离级别设置为repeatable read(可重复读)
在B未更新数据之前:
客户端A:
B更新数据:客户端B:
客户端A:
B插入数据:客户端B:
客户端A:
由以上的实验可以得出结论,可重复读隔离级别只允许读取已提交记录,而且在一个事务两次读取一个记录期间,其他事务部的更新
该记录。但该事务不要求与其他事务可串行化。例如,当一个事务可以找到由一个已提交事务更新的记录,但是可能产生幻读问题(注意是可能,因为数据库对隔离级别的实现有所差别)。像以上的实验,就没有出现数据幻读的问题。
(四)、将A的隔离级别设置为可串行化 (Serializable)
A端打开事务,B端插入一条记录
事务A端:
事务B端:
因为此时事务A的隔离级别设置为serializable,开始事务后,并没有提交,所以事务B只能等待。
事务A提交事务:
事务A端
事务B端
serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。