`

MySQL隔离级别

 
阅读更多
原文地址:http://blog.csdn.net/taylor_tao/article/details/7063639



事务具有ACID四种特性。

但是Isolation并发可能引起如下问题:

1.脏读

允许读取到未提交的脏数据。

2.不可重复读

如果你在时间点T1读取了一些记录,在T2时再想重新读取一次同样的这些记录时,这些记录可能已经被改变、或者消失不见。

3.幻读

解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。

由ANSI/ISO定义的SQL-92标准定义的四种隔离级别

1.Read Uncommitted

2.Read Committed

3.Repeatable Read

4.Serializable


隔离解别 脏读 不可重复读 幻读
Read Uncommitted Y Y Y
Read Committed N Y Y
Repeatable(default) N N Y
Serializable N N N
下面用Mysql数据库做一些小实验

Mysql 版本号

[sql] view plaincopy
mysql> select version(); 
+------------+ 
| version()  | 
+------------+ 
| 5.1.52-log | 
+------------+ 
1 row in set (0.00 sec) 
查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别

[sql] view plaincopy
mysql> select @@global.tx_isolation,@@tx_isolation; 
+-----------------------+-----------------+ 
| @@global.tx_isolation | @@tx_isolation  | 
+-----------------------+-----------------+ 
| REPEATABLE-READ       | REPEATABLE-READ | 
+-----------------------+-----------------+ 
1 row in set (0.00 sec) 

更改会话级的隔离级别
[sql] view plaincopy
Session 1: 
mysql> set session tx_isolation='read-uncommitted'; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select @@global.tx_isolation,@@tx_isolation; 
+-----------------------+------------------+ 
| @@global.tx_isolation | @@tx_isolation   | 
+-----------------------+------------------+ 
| REPEATABLE-READ       | READ-UNCOMMITTED | 
+-----------------------+------------------+ 
1 row in set (0.00 sec) 
 
 
Session 2: 
mysql> select @@global.tx_isolation, @@tx_isolation; 
+-----------------------+-----------------+ 
| @@global.tx_isolation | @@tx_isolation  | 
+-----------------------+-----------------+ 
| REPEATABLE-READ       | REPEATABLE-READ | 
+-----------------------+-----------------+ 
1 row in set (0.00 sec) 

更改系统级的隔离级别
[sql] view plaincopy
Session 1: 
mysql> set global tx_isolation='read-uncommitted'; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select @@global.tx_isolation,@@tx_isolation; 
+-----------------------+------------------+ 
| @@global.tx_isolation | @@tx_isolation   | 
+-----------------------+------------------+ 
| READ-UNCOMMITTED      | READ-UNCOMMITTED | 
+-----------------------+------------------+ 
1 row in set (0.00 sec) 
 
Session 2: 
mysql> select @@global.tx_isolation, @@tx_isolation; 
+-----------------------+-----------------+ 
| @@global.tx_isolation | @@tx_isolation  | 
+-----------------------+-----------------+ 
| READ-UNCOMMITTED      | REPEATABLE-READ | 
+-----------------------+-----------------+ 
1 row in set (0.00 sec) 

关闭SQL语句的自动提交

[sql] view plaincopy
mysql> set autocommit=off; 
Query OK, 0 rows affected (0.00 sec) 

查看SQL语句自动提交是否关闭

[plain] view plaincopy
mysql> show variables like 'autocommit'; 
+---------------+-------+ 
| Variable_name | Value | 
+---------------+-------+ 
| autocommit    | OFF   | 
+---------------+-------+ 
1 row in set (0.00 sec) 

建立实验表
[sql] view plaincopy
mysql> create table tao (col1 tinyint unsigned, col2 varchar(20), primary key(col1)); 
Query OK, 0 rows affected (0.08 sec) 
 
mysql> show create table tao \G; 
*************************** 1. row *************************** 
       Table: tao 
Create Table: CREATE TABLE `tao` ( 
  `col1` tinyint(3) unsigned NOT NULL DEFAULT '0', 
  `col2` varchar(20) DEFAULT NULL, 
  PRIMARY KEY (`col1`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

演示脏读


更改隔离级别为Read Committed后,不存在脏读的问题。

[sql] view plaincopy
mysql> set global tx_isolation='read-committed'; 
Query OK, 0 rows affected (0.00 sec) 
mysql> set session tx_isolation='read-committed'; 
Query OK, 0 rows affected (0.00 sec) 

演示不可重复读


更改隔离级别为Repeatable Read后,不存在不可重复读的问题。

[sql] view plaincopy
mysql> set global tx_isolation='repeatable-read'; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> set session tx_isolation='repeatable-read'; 
Query OK, 0 rows affected (0.00 sec) 

幻读


更改隔离级别为完全串行化 Serializable 后,不存在幻读的问题。

[sql] view plaincopy
mysql> set global tx_isolation='serializable'; 
Query OK, 0 rows affected (0.00 sec) 
 
mysql> set session tx_isolation='serializable'; 
Query OK, 0 rows affected (0.00 sec) 

在这种情况下,只允许一个事务在执行,其它事务必须等待这个事务执行完后才能执行。没有并发,只是单纯的串行。
分享到:
评论

相关推荐

    MySQL事务隔离级别

    MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...

    Mysql的四种隔离级别

    Mysql的四种隔离级别 Mysql的四种隔离级别 Mysql的四种隔离级别

    52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf

    MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...

    MySQL的四种事务隔离级别

    MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...

    MY SQL 事务隔离 查询:默认事务隔离级别

    查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别

    MySQL数据库:事务隔离级别.pptx

    事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...

    关于Mysql隔离级别、锁与MVCC介绍

    MySQL数据库在处理并发事务时,采用了多种机制来确保数据的一致性和隔离性,其中关键的概念包括隔离级别、锁以及多版本并发控制(MVCC)。理解这些机制有助于优化数据库性能和解决并发冲突。 首先,隔离级别是...

    MySQL lock & 隔离级别

    来自一线大厂的MySQL lock 隔离级别的相关介绍,很赞,强烈推荐

    56 MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?l.pdf

    MySQL的可重复读(RR)隔离级别是一种重要的事务隔离级别,旨在避免不可重复读和幻读问题,保证事务在并发环境下的一致性。ReadView(读视图)机制是实现这一隔离级别核心手段之一。本文将详细解析MySQL RR隔离级别...

    深入解析MySQL的隔离级别配置及其影响.rar

    本文将详细介绍MySQL的隔离级别,如何配置它们,以及不同隔离级别对数据库性能和并发能力的影响。 选择合适的隔离级别对于确保数据库的并发性能和数据一致性至关重要。通过理解不同隔离级别的特点和影响,数据库管理...

    MySQL数据库事务隔离级别详解

    MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...

    Mysql的隔离级别与锁

    MySQL数据库在处理并发事务时,隔离级别和锁机制起着至关重要的作用,它们确保了数据的一致性和安全性。本文将详细探讨这两个概念及其在生产环境中的应用。 首先,`autocommit` 参数决定了MySQL是否会自动提交事务...

    mysql事务隔离级别1

    MySQL中的事务隔离级别是数据库管理系统确保事务之间相互独立的重要机制,它主要针对并发操作时可能出现的问题,如脏读、不可重复读和幻读等。在MySQL的InnoDB存储引擎中,有四种不同的事务隔离级别: 1. **读未...

    mysql原理之隔离级别1

    MySQL 数据库中的事务隔离级别是确保数据库在高并发环境下数据一致性的重要机制。SQL 标准定义了四个隔离级别,它们分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable,每种级别都针对不同...

    mysql 8.0.22.0 下载安装配置方法图文教程

    mysql 8.0.22 下载安装配置方法,供大家参考,具体内容如下 ... ... 您可能感兴趣的文章:mysql多版本并发控制MVCC的实现关于Mysql隔离级别、锁与MVCC介绍SpringBoot中通过实现WebMvcConfigurer参数

    MySQL数据库隔离级别1.txt

    MySQL数据库隔离级别

    Mysql事务隔离级别.docx

    Mysql事务隔离级别.docx

Global site tag (gtag.js) - Google Analytics