SQL标准中支持4种事务隔离级别,READ_UNCOMMITTED(读未提交),READ_COMMITTED(读已提交),REPEATABLE_READ(可重复读),SERIALIZABLE(串行读),MySQL innodb引擎支持全部这4种事务隔离级别。
工具/原料:
联想Y7000P
Windows10
MySQL6.0
1、启动命令行窗口,连接MySQL数据库
图示,通过MySQL提供的客户端命令mysql连接MySQL数据库。
2、通过系统变量查询数据库当前事务隔离级别
图示,通过查询数据库提供的系统变量 tx_isolation 或 transaction_isolation 的值即可获取当前的事务隔离级别。MySQL数据库默认的事务隔离级别是REPEATABLE_READ (可重复读)。
3、设置本次会话的事务隔离级别
图示,通过命令set session transaction isolation level可以设置本次会话的事务隔离级别,该设置不会影响其他会话,并且设置会随着当前会话的结束而结束。
4、设置全局会话的事务隔离级别
图示,通过命令set global transaction isolation level可以设置全局会话的事务隔离级别,该设置不会影响当前已经连接的会话,设置完毕后,新打开的会话,将使用新设置的事务隔离级别。
5、设置一次 *** 作的事务隔离级别
图示,通过命令set transaction isolation level可设置下一次事务 *** 作的隔离级别,该设置会随着下一次事务的提交而失效。
mysql的4种事务隔离级别,如下所示:
1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据。
2、提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。
3、可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读。
4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。
相关简介
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题:
上面的任何一个问题都可能会导致数据的不一致性。为了保证数据的一致性,系统必须能够处理这些问题。事务就是我们抽象出来简化这些问题的首选机制。事务的概念起源于数据库,目前,已经成为一个比较广泛的概念。
何为事务? 一言蔽之, 事务是逻辑上的一组 *** 作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元,这个转账会涉及到两个关键 *** 作,这两个 *** 作必须都成功或者都失败。
事务会把这两个 *** 作就可以看成逻辑上的一个整体,这个整体包含的 *** 作要么都成功,要么都要失败。这样就不会出现小明余额减少而小红的余额却并没有增加的情况。
大多数情况下,我们在谈论事务的时候,如果没有特指 分布式事务 ,往往指的就是 数据库事务 。
数据库事务在我们日常开发中接触的最多了。如果你的项目属于单体架构的话,你接触到的往往就是数据库事务了。
那数据库事务有什么作用呢?
简单来说,数据库事务可以保证多个对数据库的 *** 作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库 *** 作遵循: 要么全部执行成功,要么全部不执行 。
另外,关系型数据库(例如: MySQL 、 SQL Server 、 Oracle 等)事务都有 ACID 特性:
ACID
这里要额外补充一点: 只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!
在典型的应用程序中,多个事务并发运行,经常会 *** 作相同的数据来完成各自的任务(多个用户对同一数据进行 *** 作)。并发虽然是必须的,但可能会导致以下的问题。
不可重复读和幻读区别 :不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次查询同一条查询语句(DQL)时,记录发现记录增多或减少了。
SQL 标准定义了四个隔离级别:
隔离级别脏读不可重复读幻读 READ-UNCOMMITTED READ-COMMITTED REPEATABLE-READ SERIALIZABLE
MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。
SERIALIZABLE 隔离级别,是通过锁来实现的。除了 SERIALIZABLE 隔离级别,其他的隔离级别都是基于 MVCC 实现。
不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 。我们可以通过 SELECT @@tx_isolation命令来查看,MySQL 8.0 该命令改为 SELECT @@transaction_isolation
从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。
但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失。
InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE 隔离级别。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)