Mysql有4种事务隔离水平(Transaction Isolation Levels)
1.未提交读(Read Uncommitted):一个事务可能读取到其他会话中未提交事务修改的数据,就是脏读(dirty read)。这种隔离水平是没有实际意义的。
2.提交读(Read Committed):从字面理解的意思是事务只能读取到已经提交的数据。在High Performance Mysql一书的解释是:
引用
a transaction will see only those changes made by transactions that were already committed when it began, and its changes won’t be visible to others until it has committed.
单纯从字面上还是有点绕口。其实比较简单,就是一个事务里面如果有对一个数据的多次访问,Read Committed不保证每次访问的结果都一样。如果别的会话在该事务2次访问数据之间对该数据进行了修改或者删除,2次访问就会得到不一样的结果。
所以这个隔离水平也叫nonrepeatable read(不可重复读)。
Oracle缺省使用这个隔离水平。
3. 可重复读(Repeated Read):可重复读,结合上面对提交读的解释,这个隔离水平就很好理解。一个事务里面如果有对一个数据的多次访问,Repeated Read会保证在该事务内所有访问结果都一致,不管其他会话是否尝试对该数据修改或者删除。
Mysql的InnoDB缺省使用这个隔离水平。
可重复读可能会带来幻读(phantom read)的问题。幻读是指一个事务里面如果有对一个数据的多次访问,后一次的访问读到别的会话插入的数据。(别的会话刚好插入一个数据满足改访问的where条件)。
但是mysql innodb通过multiversion concurrency control技术保证了不会发生幻读的情况。
4. 串行(Serializable):串行化访问,每次读都需要获得表级共享锁,读写相互都会阻塞。串行的最大问题的是并发能力非常低。
--------------------华丽的分割线---------------------------
为了更好的区别Read Committed和Repeated Read,读者可以参考这个例子:
1) 首先建立一个表:
CREATE TABLE t1(id int,value int);
INSERT t1 VALUES(1,1);
2) 测试Read Committed会出现不可重复读的情况
同时打开两个的会话,在第一个会话执行以下的sql:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 设置Read Committed级别
START TRANSACTION;
SELECT * FROM t1;
select sleep(10); -- 休眠10秒,等待另一个会话修改数据
SELECT * FROM t1;
commit ;
在第一个会话休眠期期间,在第二个会话执行以下的SQL:
update t1 set value = 2 where id =1;
第一个会话结束后,可以看到两个SELECT的结果是不一样的,第二次select被第二个会话的数据修改影响了。
3)测试Repeated Read的可重复读能力
在会话一执行以下SQL:
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 设置 repeatable read级别
START TRANSACTION;
SELECT * FROM t1;
select sleep(10); -- 休眠10秒,等待另一个会话修改数据
SELECT * FROM t1;
Commit ;
在第一个会话休眠期期间,在第二个会话执行以下的SQL:
update t1 set value = 3 where id =1;
第一个会话结束后,可以看到两个SELECT的结果是完全一样的,而且第二个会话没有被阻塞,并不是串行的读写来保证可重复读。
分享到:
相关推荐
MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...
深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...
事务隔离 查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务...
三、MySQL事务隔离级别 MySQL通过设置不同的事务隔离级别来解决并发问题。隔离级别越高,并发性能越低,但数据一致性越好。 1. 读未提交(read-uncommitted):允许事务读取未提交的数据,不能防止脏读,是最宽松的...
### MySQL事务的隔离性 #### 一、事务与MySQL架构 **事务**是数据库管理系统执行过程中的一系列逻辑操作,这些操作作为一个完整的单元被执行。如果事务内的所有操作都成功完成,则整个事务成功;如果其中一个操作...
在介绍和分析数据库事务隔离级别的经典文献《A Critique of ANSI SQL Isolation Levels》中,作者Hal Berenson、Phil Bernstein、Jim Gray、Jim Melton、Elizabeth O’Neil和Patrick O'Neil深入探讨了ANSI SQL-92...
MySQL数据库的事务隔离级别是数据库管理系统中用于控制事务处理中并发操作的重要机制。在多用户同时访问数据库的情况下,事务隔离级别能够确保数据的一致性和完整性,避免并发操作带来的各种问题,如脏读、不可重复...
MySQL中的事务隔离级别是数据库管理系统确保事务之间相互独立的重要机制,它主要针对并发操作时可能出现的问题,如脏读、不可重复读和幻读等。在MySQL的InnoDB存储引擎中,有四种不同的事务隔离级别: 1. **读未...
详解Mysql事务隔离级别与锁机制 本篇文章详细介绍了Mysql事务隔离级别与锁机制的概念、原理和应用。事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,包括脏写、不可重复读、幻读等问题。锁机制是...
事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互的程度。隔离性强制对事务进行某种程度的隔离,保证应用程序在事务中看到一致的数据。 MySQL提供了下面4种隔离级:序列化(SERIALIZABLE...
"深入理解Mysql事务隔离级别与锁机制" 事务隔离级别是数据库系统中的一种机制,用于解决多事务并发问题,使得事务之间的执行不受影响。这种机制可以分为四个级别:Read Uncommitted、Read Committed、Repeatable ...
总之,MySQL 的事务隔离机制允许用户根据需要选择合适级别的隔离,同时提供了 `SET TRANSACTION ISOLATION LEVEL` 命令和 Spring 的 `@Transactional` 注解来灵活配置,以保证数据的一致性和应用的性能。对于开发者...
我是李福春,今天的问题是,mysql是如何实现事务隔离的?在实际开发中应该如何正确的使用事务? ACID特性 事务首先具备ACID特性,即 Atomic原子性, Consistency一致性 Isolation隔离性 durability持久性; 事务...
2. ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它允许外一个事务可以看到这个事务未提交的数据。 3. ISOLATION_READ_COMMITTED:保证一个事务修改的数据提交后才能被另外一个事务读取。 4. ISOLATION_...
DB - A Critique of ANSI SQL Isolation Levels.pdf ANSI SQL-92 [MS, ANSI] defines Isolation Levels in terms of phenomena: Dirty Reads, Non-Re-peatable Reads, and Phantoms. This document shows that ...