`
IXHONG
  • 浏览: 450422 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL隔离级别实验

阅读更多

事务具有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 版本号

 

mysql> select version();
+------------+
| version()  |
+------------+
| 5.1.52-log |
+------------+
1 row in set (0.00 sec)

 

 

查看InnoDB存储引擎 系统级的隔离级别 和 会话级的隔离级别

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


更改会话级的隔离级别

 

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)


更改系统级的隔离级别

 

 

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语句的自动提交

 

mysql> set autocommit=off;
Query OK, 0 rows affected (0.00 sec)

 

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

 

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


建立实验表

 

 

 

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后,不存在脏读的问题。

 

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后,不存在不可重复读的问题。

 

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 后,不存在幻读的问题。

 

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)


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

0
0
分享到:
评论

相关推荐

    mysql原理之隔离级别1

    实验过程展示了不同隔离级别下的行为。在 Read Uncommitted 隔离级别下,事务A可以看到事务B未提交的更改,导致脏读。而在 Read Committed 隔离级别下,虽然解决了脏读,但事务A两次查询的结果不同,显示了不可重复...

    数据库 实验指导4 MYSQL基础实验操作 (2).rar

    4. **事务隔离级别**:了解READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE四种隔离级别及其应用场景。 ### 九、视图与存储过程 1. **创建视图**:`CREATE VIEW 视图名 AS SELECT 语句;`创建...

    Mysql事务隔离级别之读提交详解

    通过一个简单的实验来演示“读提交”隔离级别的行为: 首先,我们有两个查询终端A和B,都开启了事务。此时,两个终端看到的`order`表中的`number`字段值都是1。接着,B终端执行更新操作,将`number`改为2,但不提交...

    大学 数据库 实验 报告 数据库原理实验

    【数据库原理实验报告——SQL Server 2000系统安装及管理】 实验目的:掌握SQL Server 2000的安装、配置、管理和基本操作,包括数据库的创建、修改、删除以及查询分析器的使用。 一、SQL Server 2000安装与配置 1...

    mysql 实验训练1-4

    你将学习如何开始事务、提交事务、回滚事务以及理解隔离级别。 7. **视图**: 视图是虚拟表,基于一个或多个表的查询结果。它们可以简化复杂的查询,提供安全访问控制,并帮助保持数据一致性。 8. **存储过程和...

    mysql学习代码、实验楼.zip

    6. **事务与并发控制**:学习如何使用事务(TRANSACTION)确保数据的一致性,以及理解隔离级别(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE)和死锁(Deadlock)的概念。 7. **存储引擎**:...

    MySQL 实验七 视图和事务 .docx

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,它提供了丰富的功能,包括视图和事务处理,这两个概念在本实验中被深入探讨。视图是数据库中一个虚拟的表,它基于一个或多个现有表的查询结果,而事务则是确保...

    4-史文翰-实验七1

    在本次实验中,史文翰探讨了两种类型的事务模式以及MySQL中的四种事务隔离级别。 首先,实验介绍了两种数据库事务模式:显示事务和隐式事务。 1. **显示事务**: 显示事务是通过明确的开始(BEGIN)、提交...

    MySQL四种事务隔离级别详解

    本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)  1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会...

    Mysql Mysql学习资料

    - 事务(Transactions):理解ACID(原子性、一致性、隔离性和持久性)原则,保证数据的完整性。 - 索引(Indexes):创建索引以优化查询性能,了解B-Tree、Hash、Full-text等不同类型的索引。 3. **MySQL性能...

    实验121

    实验121主要探讨了MySQL中的InnoDB存储引擎在处理并发事务时的隔离级别和其对数据一致性的影响,特别是不可重复读和幻影读的问题。InnoDB存储引擎是MySQL中最常用的事务型存储引擎,它支持多种事务隔离级别,以确保...

    数据库实验报告数据库实验报告数据库实验报告

    - 实践事务的提交、回滚和隔离级别设置 - 索引的创建与管理,分析索引对查询性能的影响 - 查询优化,如使用EXPLAIN分析查询执行计划 通过对这三个实验的逐步学习,学生将能够掌握数据库系统的基本操作,理解数据库...

    BUPT数据库实验大三

    实验四:可能会探讨事务处理和并发控制,讲解ACID(原子性、一致性、隔离性、持久性)特性,以及事务的提交、回滚和隔离级别。学生将学习如何在多用户环境下保证数据的一致性和完整性。 实验五:聚焦于数据库备份与...

    18329015_郝裕玮_Lab121

    实验报告涉及的是数据库系统的事务隔离级别以及锁的概念,主要通过MySQL数据库进行操作。实验的核心是理解和展示不同隔离级别下可能出现的问题,以及如何通过锁机制来防止这些问题。 首先,实验12.1展示了未提交读...

    七百万mysql测试数据

    在进行数据库优化时,除了索引和存储过程,还有其他因素需要考虑,例如:合理设置数据库参数(如innodb_buffer_pool_size、query_cache_size等)、使用合适的事务隔离级别、适当的数据类型选择以及数据库设计模式等...

    数据库进阶-事务索引问答.pdf

    《数据库进阶-事务索引问答》探讨了MySQL数据库中关于事务隔离级别的深入理解,特别是Read Committed(RC)和Repeatable Read(RR)隔离级别的差异。在这个案例中,我们通过一个具体的实验来分析RC隔离级别如何处理...

    3-mysql管理、监控、优化.docx

    - 调整数据库参数,例如增大缓冲池大小、调整事务隔离级别等,以适应特定工作负载。 通过这个实验,你将深入理解MySQL的日常管理和性能优化,为构建高效、可靠的数据库环境打下坚实基础。记得在实践中不断学习和...

    mysql_ppt.rar_Mysql入门

    - 权限系统:MySQL提供多种级别的权限,如SELECT、INSERT、UPDATE、DELETE等,以及全局、数据库、表和列级别。 9. **备份与恢复** - 数据备份:使用`mysqldump`命令生成SQL脚本或二进制文件。 - 数据恢复:导入...

    mysql课件.rar

    MySQL支持事务的开始(BEGIN)、提交(COMMIT)、回滚(ROLLBACK)操作,以及四种事务隔离级别(读未提交、读已提交、可重复读、串行化)。 7. **视图**: 视图是从一个或多个表中选择数据的虚拟表,不存储实际数据...

Global site tag (gtag.js) - Google Analytics