数据库的4中隔离级别

摘抄:https://www.cnblogs.com/snsdzjlz320/p/5761387.html

-------------------------------------------------------

此文讲述的比较详细,尤其是ReadCommitted 跟 RepertableRead。

ReadCommitted跟RepeatableRead的区别,就是ReadCommitted能读自己未提交的跟它人已提交的,RepearableRead只能读取自己未提交的跟事务开启前它人已提交的,

一旦开启事务后,它人提交的内容也读取不到,这使得它可以支持可重复读,同一个事务内读多次都是一样的数据,因为别人提交的它读不到,只有在自己也提交后才能看到。

-------------------------------------------------------

  SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。

  低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

  首先,我们使用 test 数据库,新建 tx 表,并且打开两个命令窗口来操作同一个数据库:

  第1级别:Read Uncommitted(读取未提交内容)

  (1)所有事务都可以看到其他未提交事务的执行结果

  (2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少

  (3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据

  #首先,修改隔离级别

set tx_isolation=‘READ-UNCOMMITTED‘;
select @@tx_isolation;
+------------------+
| @@tx_isolation   |
+------------------+
| READ-UNCOMMITTED |
+------------------+

  #事务A:启动一个事务

start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务B:也启动一个事务(那么两个事务交叉了) 在事务B中执行更新语句,且不提交

start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务A:那么这时候事务A能看到这个更新了的数据吗?

select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |   --->可以看到!说明我们读到了事务B还没有提交的数据
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务B:事务B回滚,仍然未提交

rollback;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务A:在事务A里面看到的也是B没有提交的数据

select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |      --->脏读意味着我在这个事务中(A中),事务B虽然没有提交,但它任何一条数据变化,我都可以看到!
|    2 |    2 |
|    3 |    3 |
+------+------+

  第2级别:Read Committed(读取提交内容)

  (1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)

  (2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变

  (3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。

   导致这种情况的原因可能有:(1)有一个交叉的事务有新的commit,导致了数据的改变;(2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

  #首先修改隔离级别

set tx_isolation=‘read-committed‘;
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+

  #事务A:启动一个事务

start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务B:也启动一个事务(那么两个事务交叉了)在这事务中更新数据,且未提交

start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务A:这个时候我们在事务A中能看到数据的变化吗?

select * from tx; --------------->
+------+------+                |
| id   | num  |                |
+------+------+                |
|    1 |    1 |--->并不能看到!  |
|    2 |    2 |                |
|    3 |    3 |                |
+------+------+                |——>相同的select语句,结果却不一样
                               |

  #事务B:如果提交了事务B呢?

commit;

  #事务A:

select * from tx; --------------->
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |--->因为事务B已经提交了,所以在A中我们看到了数据变化
|    2 |    2 |
|    3 |    3 |
+------+------+

  第3级别:Repeatable Read(可重读)

  (1)这是MySQL的默认事务隔离级别

  (2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

  (3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行

  (4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

  #首先,更改隔离级别

set tx_isolation=‘repeatable-read‘;
select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

  #事务A:启动一个事务

start transaction;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务B:开启一个新事务(那么这两个事务交叉了) 在事务B中更新数据,并提交

start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+
commit;

  #事务A:这时候即使事务B已经提交了,但A能不能看到数据变化?

select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |    1 | --->还是看不到的!(这个级别2不一样,也说明级别3解决了不可重复读问题)
|    2 |    2 |
|    3 |    3 |
+------+------+

  #事务A:只有当事务A也提交了,它才能够看到数据变化

commit;
select * from tx;
+------+------+
| id   | num  |
+------+------+
|    1 |   10 |
|    2 |    2 |
|    3 |    3 |
+------+------+

  第4级别:Serializable(可串行化)

  (1)这是最高的隔离级别

  (2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。

  (3)在这个级别,可能导致大量的超时现象和锁竞争

  #首先修改隔离界别

set tx_isolation=‘serializable‘;
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+

  #事务A:开启一个新事务

start transaction;

  #事务B:在A没有commit之前,这个交叉事务是不能更改数据的

start transaction;
insert tx values(‘4‘,‘4‘);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
update tx set num=10 where id=1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

  

原文地址:https://www.cnblogs.com/nevermorewang/p/8282778.html

时间: 2024-11-11 17:51:58

数据库的4中隔离级别的相关文章

spring事务中隔离级别和spring的事务传播机制

Transaction 也就是所谓的事务了,通俗理解就是一件事情.从小,父母就教育我们,做事情要有始有终,不能半途而废. 事务也是这样,不能做一般就不做了,要么做完,要 么就不做.也就是说,事务必须是一个不可分割的整体,就像我们在化学课里学到的原子,原子是构成物质的最小单位.于是,人们就归纳出事务的第一个特性:原子性(Atomicity).我靠,一点都不神秘嘛. 特别是在数据库领域,事务是一个非常重要的概念,除了原子性以外,它还有一个极其重要的特性,那就是:一致性(Consistency).也就

数据库的四种隔离级别和事务的四特性

数据库事务的四大特性: 事务(Transaction)是并发控制的基本单位.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行. 1.数据库事务必须具备ACID特性,ACID是Atomic(原子性).Consistency(一致性).Isolation(隔离性)和Durability(持久性)的英文缩写. 1)原子性(Atomicity) 一个事务(transactio

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

数据库(1)-事物的隔离级别

定义 事物是需要保持一致性的一批语句的集合,一个事物中的语句执行需要一定的时间,在此时间内对待外部变化的策略就是隔离级别. 事物的隔离级别有四种:读未提交,读已提交,可重复读,串行化. 安全性依次提高,性能依次下降. 1.读未提交 当事物隔离级别被设置为读未提交时,在此事物期间,外部事物未提交的更新可以被读取到. 所以会发生脏读. 事物A set tx_isolation='READ-UNCOMMITTED'; start TRANSACTION; 事物B start TRANSACTION;

数据库事务、事务隔离级别以及锁机制详解

以下主要以MySQL(InnoDB引擎)数据库为讨论背景,纯属个人学习总结,不对的地方还请指出! 什么是事务? 事务是作为一个逻辑单元执行的一系列操作,要么一起成功,要么一起失败.一个逻辑工作单元必须有四个属性,称为 ACID(原子性.致性.隔离性和持久性)属性,只有这样才能成为一个事务. 数据库事物的四大特性(ACID): 1)原子性:(Atomicity) 务必须是原子工作单元:对于其数据修改,要么全都执行,要么全都不执行. 2)一致性:(Consistency) 事务在完成时,必须使所有的

数据库的特性与隔离级别和spring事务的传播机制和隔离级别

首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离性: 对于同一个表的操作,每个事务都是单独的,不会影响其他事务. Durability 持久性: 事务一旦提交,数据库中的数据就是永久的了. 对于以上四种特性中的隔离性,不同的策略会有不同的弊端:脏读,不可重复读,幻读. 脏读: 就是一个事务读取了别的事务执行过程中未提交的数据. 不可重复读: 就是

理解数据库的4种隔离级别

本文转自:http://m.blog.csdn.net/article/details?id=51924963 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted .Read committed .Repeatable read .Serializable .而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读.下面通过事例一一阐述它们的概念与联系. Read uncommitted 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据. 事例:老板要给程序

数据库四种事务隔离级别详解

四种数据库隔离级别如下所示: 1.READ-UNCOMMITTED(读取未提交内容) 由于在该隔离级别下即使事务未提交所做的修改也会对其他事务产生影响.所以该级别会出现数据脏读的发生.脏读:一个事务读取了另一个未提交的并行事务写的数据. 举例:老板给员工发工资,老板开启事务,然后想员工的账户转钱10000元.此时员工开启事务,查看账户余额发现多了10000元,然后提交事务.但是老板发现转多了,于是修改为转5000元,然后提交事务.最终员工账户多5000元而不是10000元,所以之前员工看到的10

数据库事务特性和隔离级别

事务 一组业务操作,要么全部成功,要么全部不成功. ----------------事务的特性-------------- 原子性:一个事务是一个整体,不可分割,事务中的操作要么都成功,要么都失败. 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态.事务执行前后,数据库的状态是一致的. 例如:A有1000,元,B有1000元,加起来是2000,中间执行转账的操作,转账后两个人的钱加起来还是2000. 隔离性:两个或多个事务并发操作,之间会互相影响.数据库提供了隔离级别来消除这些影响