事务具有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)
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)
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 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)
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)
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> 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)
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)
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)
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)
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事务隔离级别.docx
事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...
【Java面试】请你简单说一下Mysql的事务隔离级别.doc
- **事务和隔离级别**:了解ACID属性,理解四种事务隔离级别,根据业务需求选择合适的级别。 - **日志管理**:配置错误日志、慢查询日志,便于排查问题和优化查询。 在MySQL 5.7.35中,还引入了如GTID(全局事务...
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
它支持多版本并发控制(MVCC),确保在高并发环境下提供更好的隔离级别。另外,这个版本还引入了半同步复制(Semi-Synchronous Replication),确保至少有一个从库接收到主库的事务提交确认,增强了数据的一致性。 ...
在MySQL中,可以通过`SET TRANSACTION`语句来设定事务隔离级别。例如,将当前会话的隔离级别设置为可重复读: ```sql SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; ``` 查看当前的事务隔离级别,可以使用...
【事务隔离级别】 在计算机科学,特别是在数据库管理系统(DBMS)中,事务隔离级别是确保数据库并发操作一致性的重要概念。事务是一系列数据库操作的逻辑单元,必须作为一个整体执行,要么全部成功,要么全部失败。...
### 数据库事务隔离级别详解 ...例如,MySQL默认使用Repeatable Read作为隔离级别,而Oracle则默认使用Read Committed。每种隔离级别都有其适用场景,合理设置可以帮助开发者更好地管理数据的一致性和系统的性能。
Mysql的四种隔离级别 Mysql的四种隔离级别 Mysql的四种隔离级别
│ 4_InnoDB事务隔离级别详解.mp4 │ 5_InnoDB死锁发生原理和规避.mp4 │ 6_MySQL字符集和排序规则.mp4 │ 作业.docx │ 锁等待分析.txt │ ├─新版MySQL DBA综合实战班 第08天 │ 1_课堂作业讲解.mp4 │ 2_MySQL...
MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
例如InnoDB引擎在MySQL中的默认隔离级别。 4. SERIALIZABLE(序列化):最高级别的隔离,完全避免了脏读、不可重复读和幻读,但性能较低,因为它对并发性进行了最严格的限制。 在Spring中,通过`@Transactional`...
查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别
MySQL数据库隔离级别
在MySQL中查询当前的事务隔离级别可以通过以下命令实现: ```sql SELECT @@tx_isolation; ``` MySQL数据库默认的事务隔离级别是 `REPEATABLE READ`。 #### 结论 综上所述,事务及其四大特性对于确保数据库操作的...
1. 增强的事务隔离级别:支持可重复读(REPEATABLE READ)隔离级别的改进,减少幻读现象。 2. 嵌套事务:在同一个连接中可以开启多个事务,提高并发处理能力。 3. 全新的InnoDB表空间加密:为数据文件提供透明加密,...