`

数据库隔离机制在mysql下的测试 ---- 20161022

阅读更多

一、数据库隔离机制简介。

关于数据库隔离机制的概念,可以参考看另一篇文章http://simon-9527.iteye.com/blog/2311351

首先了解什么是事务

1、事务概念:事务是包含了一组有序的数据库操作命令的序列,它是数据库并发操作的最小控制单位。

2、事务特性:原子性:事务包含的数据库操作命令要么都执行,要么都不执行。

一致性:当事务完成时,数据库处于稳定而一致的状态。即事务执行后,数据库数据要符合规定,而且所有数据查询       的结果是一致的。

隔离性:多个事务同时执行时,他们之间是互不干扰的。

永久性:一旦事务提交成功,它引发的变化也就永久保存了下来,硬件与应用程序发生错误也不能改变。

3、事务状态:

4、事务操作命令

         

 

在并发执行事务时会发生什么问题呢?

 

1、丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖(事务A和B并发执行,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了)。

 

2、脏读:一个事务读到另一个事务未提交的更新数据(事务A和B并发执行,B事务执行更新后,A事务查询B事务没有提交的数据,B事务回滚,则A事务得到的数据不是数据库中的真实数据。也就是脏数据,即和数据库中不一致的数据)。


3、不可重复读:一个事务读到另一个事务已提交的更新数据(事务A和B事务并发执行,A事务查询数据,然后B事务更新该数据,A再次查询该数据时,发现该数据变化了)。


4、覆盖更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据(即A事务更新数据,然后B事务更新该数据,A事务查询发现自己更新的数据变了)。

 

5、虚读(幻读):一个事务读到另一个事务已提交的新插入的数据(A和B事务并发执行,A事务查询数据,B事务插入或者删除数据,A事务再次查询发现结果集中有以前没有的数据或者以前有的数据消失了)。

数据库系统提供了四种事务隔离级别供用户选择

1、Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新(事务执行的时候不允许别的事务并发执行。事务串行化执行,事务只能一个接着一个地执行,而不能并发执行。)。

2、Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。

3、Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。

4、Read Uncommitted(读未提交数据):一个事务在执行过程中可以看到其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

 

 

 

 

丢失更新

脏读

非重复读

覆盖更新

幻像读

未提交读

Y

Y

Y

Y

Y

已提交读

N

N

Y

Y

Y

可重复读

N

N

N

N

Y

串行化

N

N

N

N

N

MYSQL默认是什么隔离级别?

    Repeatable read

 

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

 

如何查看/修改隔离级别?

    查看:select @@GLOBAL.tx_isolation, @@session.tx_isolation;
    修改:set session transaction isolation level repeatable read;  #repeatable read 可修改成 serializable等

 

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

 

二、在mysql中的测试。

1. 建立测试表

 

 CREATE TABLE `test_isolation` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 2. 直接在本地打开两个mysql命令窗口,其实就应该是两个连接,连个不同的事务,进行测试。

 

第一个窗口直接插入一条数据:

 

mysql> insert into test_isolation (name) values ('simon');
Query OK, 1 row affected (0.03 sec)

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
+----+-------+
1 row in set (0.00 sec)

 

 

第二个窗口查询结果:

 

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
+----+-------+
1 row in set (0.00 sec)

 

 

发现能够查出结果。这并不是说明数据库的隔离机制没有起作用,而是由于mySql数据库的自动提交特性导致的。当采用默认的自动提交时,每一个sql都是一个独立的事务,执行完后直接提交了,这样你在其他的连接或者说事务中也就可以看到提交的结果了。

 

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
+----+-------+
1 row in set (0.00 sec)

 3. 禁止mysql自动提交功能。

(1)可以直接自己手动建立transaction, 通过begin,或者start transaction。

 

 

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

 

 

(2)关掉自动提交功能,session级别的可以直接设置,数据库级别的需要设置配置文件,不过低版本好像不支持,具体可以自己搜索相关的文章。

 

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

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

 

 

4. 这时再进行测试

 第一个窗口:

mysql> insert into test_isolation (name) values ('simon');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
| 52 | simon |
+----+-------+
2 rows in set (0.00 sec)

 

 

第二个窗口,这时是看不到第一个事务没有提交的数据的。

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
+----+-------+
1 row in set (0.00 sec)

 

在第一个窗口提交:

mysql> commit;
Query OK, 0 rows affected (0.03 sec)

 

这时第二个窗口的结果,已经可以看到数据。

mysql> select * from test_isolation;
+----+-------+
| id | name  |
+----+-------+
| 51 | simon |
+----+-------+
1 row in set (0.00 sec)

 

其他的update,delete的测试过程也类似。也可以设置session的隔离级别后再进行测试,以熟悉不同隔离级别的表现差异。

 

 

分享到:
评论

相关推荐

    mysql-connector-odbc-5.1.13(多平台)

    总结来说,`mysql-connector-odbc-5.1.13` 是MySQL数据库与ODBC环境之间的关键组件,它使得开发人员能够在不关心具体数据库实现的情况下,利用ODBC标准接口轻松访问MySQL数据库,极大地提高了开发效率和应用的可移植...

    mysql-connector-java-5.1.46-bin.jar

    MySQL数据库驱动程序“mysql-connector-java-5.1.46-bin.jar”是Java应用程序与MySQL数据库进行交互的重要组件。这个驱动程序实现了Java Database Connectivity (JDBC) API,允许Java开发者通过编写Java代码来连接、...

    mysql-connector-odbc-5.3.4-win32.7z

    MySQL Connector/ODBC 是 MySQL 数据库管理系统与 Microsoft Windows 系统之间的重要桥梁,它允许 Windows 上的应用程序通过 Open Database Connectivity (ODBC) 接口与 MySQL 数据库进行交互。"mysql-connector-...

    mysql-5.7.18-winx64.zip

    MySQL是世界上最流行的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。此压缩包"mysql-5.7.18-winx64.zip"包含了适用于Windows操作系统的MySQL 5.7.18版本的安装文件。这个特定版本的MySQL是一个重要的...

    mysql-5.5.32-linux2.6-x86_64.tar

    6. **安全设置**:安装完成后,应执行安全脚本`scripts/mysql_secure_installation`来设置root用户的密码,删除匿名用户,禁用远程root登录,以及删除测试数据库,确保系统安全。 7. **服务管理**:MySQL服务器可以...

    mysql-connector-java-5.1.44.src mysql connector 源码

    在MySQL Connector/J中,`org`下的类通常与特定的库或工具相关,例如认证机制或网络通信。 通过分析这些源码,我们可以学习以下关键知识点: 1. **JDBC API**:理解如何实现JDBC Driver,包括连接管理、SQL语句的...

    数据库讲义mysql05

    ### 数据库讲义mysql05知识点总结 #### 一、MySQL简介与特点 - **MySQL**:一种流行的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发。 - **特性**: - 高性能:支持大量并发连接,处理速度较快。 - ...

    mha4mysql-master和mha4mysql-node

    在MySQL数据库系统中,主从复制是实现高可用性和数据安全的重要手段。当主服务器出现故障时,从服务器能够接管工作,确保业务的连续性。而MHA(Master High Availability)正是针对这一需求设计的工具,它为MySQL...

    MYSQL数据库设计规范.docx

    MySQL作为一种广泛使用的开源关系型数据库管理系统,在企业级应用中扮演着重要角色。本文将详细介绍一份针对MySQL数据库设计的规范文档,该文档根据重要程度分为【高危】、【强制】和【建议】三个级别,旨在帮助技术...

    MySQL数据库在自动测试系统中的应用.pdf

    【MySQL数据库在自动测试系统中的应用】 MySQL数据库是当今广泛使用的开源关系型数据库管理系统,尤其在自动测试系统中,它的优势显著。MySQL以其轻量级、高效、稳定和易用的特点,成为自动化测试领域的理想数据...

    mysql-5.7.38-winx64

    这个版本的MySQL适合各种规模的企业和开发者,无论是用于开发、测试还是生产环境,都能提供高性能、安全且易于管理的数据库服务。通过深入理解和充分利用这些特性,用户可以构建更高效、可扩展和可靠的数据库系统。

    mysql-8.0.19-winx64.zip

    在备份和恢复方面,MySQL 8.0提供了一种新的在线备份工具,可以在不阻塞正常服务的情况下进行备份,极大地降低了业务中断的风险。同时,改进的恢复机制可以更快地恢复大量数据,确保业务连续性。 最后,MySQL 8.0....

    mysql数据库事务隔离级别借鉴.pdf

    实际上,在可重复读隔离级别下,MySQL通过一种名为Next-Key Locks的机制,防止了幻读,但只在InnoDB存储引擎且使用了唯一索引的情况下有效。如果在无索引或者非唯一索引的情况下,幻读仍有可能发生。 总的来说,...

    MySchool数据库设计优化

    在IT行业中,数据库设计优化是提升系统性能的关键环节,尤其对于教育领域的MySchool数据库来说,高效的数据管理和查询能力直接影响到教学、管理等各项工作的效率。本文将深入探讨MySchool数据库设计优化的重要性和...

    mysql 数据库连接池

    MySQL数据库连接池是数据库管理中的一个重要概念,它在Linux环境下被广泛应用。数据库连接池是一种管理数据库连接的技术,通过预先创建并维护一定数量的数据库连接,为应用程序提供高效、可靠的数据库访问服务。它...

    MySQL支持库-1.rar

    8. **MySQL Proxy**:允许在MySQL服务器和客户端之间插入一个代理,用于负载均衡、故障切换、性能测试等。 9. **Event Scheduler**:MySQL的事件调度器允许创建定期执行的任务,类似于SQL Server的代理服务器。 在...

    MySQL Connector/NET visual studio连接Mysql数据库控件

    这款驱动是实现Visual Studio中连接到MySQL数据库的关键组件,使得.NET开发者可以方便地在他们的应用程序中集成数据库功能。 首先,我们来详细了解MySQL Connector/NET的基本功能: 1. **数据访问接口**:MySQL ...

    MySQL实战优化-整理版

    - **性能测试**:评估系统在正常和峰值负载条件下的行为。 - **压测**:模拟大量用户并发访问场景,检验系统的极限承载能力。 - **工具使用**:利用LoadRunner、JMeter等工具进行性能测试。 - **结果分析**:分析...

    mysql数据库事务隔离级别[参照].pdf

    数据库事务是确保数据库操作一致性的重要机制,特别是在并发环境中。事务隔离级别是数据库系统用来解决并发...因此,在设计和优化数据库时,理解这些隔离级别和其背后的锁机制至关重要,以确保并发场景下的数据一致性。

Global site tag (gtag.js) - Google Analytics