返回顶部
首页 > 资讯 > 数据库 >事务隔离性和隔离级别
  • 150
分享到

事务隔离性和隔离级别

事务隔离性和隔离级别 2021-04-27 23:04:15 150人浏览 才女
摘要

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 事务的隔离级别有哪些? 一、概念 Read uncommitted(读未提交) Read

事务隔离性和隔离级别

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离

事务的隔离级别有哪些?

一、概念

  • Read uncommitted(读未提交)
  • Read Committed(读已提交)
  • Repeatable Reads(可重复读)
  • Serializable(串行化)

Read uncommitted

读未提交:隔离级别最低的一种事务级别。在这种隔离级别下,会引发脏读、不可重复读和幻读。

Read Committed

读已提交读到的都是别人提交后的值。这种隔离级别下,会引发不可重复读和幻读,但避免了脏读。

Repeatable Reads

可重复读这种隔离级别下,会引发幻读,但避免了脏读、不可重复读。

Serializable

串行化是最严格的隔离级别。在Serializable隔离级别下,所有事务按照次序依次执行。脏读、不可重复读、幻读都不会出现。

 

 

 

二、操作

查看事务隔离级别

SHOW VARIABLES LIKE "tx_isolation";

查看全局的事务隔离级别

SHOW GLOBAL VARIABLES LIKE "tx_isolation";

使用系统变量查询

SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

补充

Mysql常用命令

    • 查询隔离级别
      select @@tx_isolation;

    • 设置手动提交
      set autocommit=0 ;

    • 查看当前事务自动提交模式
      select @@autocommit;

    • 设置隔离级别
      set tx_isolation = "READ-COMMITTED";

    • 查询表的状态
      show table status like "test1";

    • 修改表的存储引擎
      alter table test1 engine = INNODB

    • 查看是否开启日志
      show variables like "log_bin";

    • 查看日志状态
      show master status;

3.2 设置mysql的事务隔离级别

语法

SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL

{

  REPEATABLE READ

  | READ COMMITTED

  | READ UNCOMMITTED

  | SERIALIZABLE

}

GLOBAL:设置全局的事务隔离级别
SESSION:设置当前session的事务隔离级别,如果语句没有指定GLOBAL或SESSION,默认值为SESSION

使用系统变量设置事务隔离级别

SET GLOBAL tx_isolation="REPEATABLE-READ";
SET SESSION tx_isolation="SERIALIZABLE";

 

如果并发事务没有进行隔离,会出现什么问题?

在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有以下问题:

问题一:脏读

脏读指一个事务读取了另外一个事务未提交的数据。

具体看后文案例介绍

问题二:不可重复读

不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同。
不可重复读和脏读的区别是,脏读是读取前一事务未提交的脏数据,不可重复读是重新读取了前一事务已提交的数据。

具体看后文案例介绍

问题三:幻读(虚读)

幻读(虚读)指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

以下都是采用mysql数据库

三、案例

下面实际操作中使用到的一些并发控制语句,可看上面的操作介绍

作为演示:product表(产品表)

  产品ID        产品名称        产品价格        产品数量   .

productIdproductNameproductPriceproductCount
1 xiaomi 1999 100
 

带着上面的问题我们来看一下,事务在没有隔离性的情况下,会引发哪些问题?

同时打开两个窗口模拟2个用户并发访问数据库

3.1事务隔离级别设置为read uncommitted

查询事务隔离级别

SELECT @@tx_isolation;

设置隔离级别为未提交读:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

注意:需要同时修改两个窗口的事务隔离级别

以下我们以两位用户抢小米手机为例

时间轴事务A事务B
T1 start transaction;  
T2 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  
T3   start transaction;
T4   select p.productName,p.productCount from product p where p.productId=1;(productCount =100)
T5   update product set productCount = 99 where productId = 1;
T6 select p.productName,p.productCount from product p where p.productId=1;(productCount =99)  
T7   ROLLBACK;
T8 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  

T1—— A用户开启事务,start transaction;
T2—— A用户查询当前小米手机剩余数量,select p.productName,p.productCount from product p where p.productId=1;此时数量显示为100。
T3——B用户开启事务,start transaction;
T4——B用户查询当前小米手机剩余数量,select p.productName,p.productCount from product p where p.productId=1;此时数量显示为100。
T5—— B用户购买了一台小米手机,update product set productCount = 99 where productId = 1; 此时只修改数据并未提交事务。
T6—— A用户刷新页面,select p.productName,p.productCount from product p where p.productId=1;此时数量显示为99。
T7—— B用户购买失败,回滚事务。
T8—— A用户查询当前小米手机剩余数量,select p.productName,p.productCount from product p where p.productId=1;此时数量显示为100。

小结:

事务A读取了未提交的数据,事务B的回滚,导致了事务A的数据不一致,导致了事务A的脏读 !

3.2事务隔离级别设置为Read Committed

查询事务隔离级别

SELECT @@tx_isolation;

更改数据库隔离级别,设置隔离级别为提交读:

SET SESSION  TRANSACTION ISOLATION LEVEL READ COMMITTED;

注意:需要同时修改两个窗口的事务隔离级别

时间轴事务A事务B
T1 start transaction;  
T2 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  
T3   start transaction;
T4   select p.productName,p.productCount from product p where p.productId=1;(productCount =100)
T5   update product set productCount = 99 where productId = 1;
T7 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  
T6   commit;
T8 select p.productName,p.productCount from product p where p.productId=1;(productCount =99)  

这里就不再对流程做过多赘述。

小结:

可以看到避免了脏读现象,但是却出现了,一个事务还没有结束,就发生了不可重复读问题,即事务A来说 productCount从 100->100->99。但这个过程中事务并未提交结束。

 

3.3事务隔离级别设置为Repeatable Read(mysql默认级别)

查询事务隔离级别

SELECT @@tx_isolation;

更改数据库隔离级别,设置隔离级别为可重复读:

SET SESSION  TRANSACTION ISOLATION LEVEL REPEATABLE READ;

注意:需要同时修改两个窗口的事务隔离级别

时间轴事务A事务B
T1 start transaction;  
T2 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  
T3   start transaction;
T4   select p.productName,p.productCount from product p where p.productId=1;(productCount =100)
T5   update product set productCount = 99 where productId = 1;
T7 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  
T6   commit;
T8 select p.productName,p.productCount from product p where p.productId=1;(productCount =100)  

这里就不再对流程做过多赘述。

小结:

可以看到可重复读隔离级别避免了脏读不可重复读的问题,但是出现了幻读现象。事务A查询到的小米数量等于100,但是事务B修改了数量为99,但是事务A读取到的值还是100。当事务A去减1等于99时,是错误的,此时应该是99-1=98才对。接下来我们再提高一个事务隔离级别。

3.4事务隔离级别设置为Serializable

查询事务隔离级别

SELECT @@tx_isolation;

更改数据库隔离级别,设置隔离级别为串行化:

SET SESSION  TRANSACTION ISOLATION LEVEL REPEATABLE READ;
时间轴事务A事务B
--- --- ---
T1 start transaction;  
T2   start transaction;
T2 select p.productName,p.productCount from product p where p.productId=1;(productCount =100);  
T4   update product set productCount = 99 where productId = 1;(等待中..)

这里就不再对流程做过多赘述。

小结:

在我们Serializable隔离级别中,我们可以看到事务B去做修改动作时卡主了,不能向下执行。这是因为:给事务A的select操作上了,所以事务B去修改值的话,就会被卡主。只有当事务A操作执行完毕,才会执行事务B的操作。这样就避免了上述三个问题了。

问题本身

  • 回到问题的本身,其实我们并不需要将事务提到这么高。

  • 问题的本身就是,当我们读完了的时候,就要在上面加锁。我们不希望别人能够去读它。因为别人读到了count,就会修改count的值,并写进去。所以我们在select 操作的时候,加上for update。这时候就会把这行操作给锁掉了。那么另外一个人也进行相同的操作,也表示select 出来的count需要进行update,需要锁住。

  • select p.productName,p.productCount from product p where p.productId=1 for update;
  • 在实际开发过程中,这样的加锁行为,是非常的耗系统性能的

本章节主要介绍了数据库中事务的ADID特性中的隔离性,在没有隔离的情况下会发生什么问题,相信大家通过本章,对数据库事务中的隔离性有了一定的了解,下篇文章我们将介绍数据库中的悲观锁与乐观锁

 

您可能感兴趣的文档:

--结束END--

本文标题: 事务隔离性和隔离级别

本文链接: https://lsjlt.com/news/8638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 事务隔离性和隔离级别
    隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 事务的隔离级别有哪些? 一、概念 Read uncommitted(读未提交) Read ...
    99+
    2021-04-27
    事务隔离性和隔离级别
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • 事务隔离级别
    事务隔离是数据库处理的基础之一,Isolation是ACID中I的缩写,当多个事务同时进行更改和执行查询时,隔离级别是微调性能和可靠性、一致性和结果再现性之间的平衡的设置 MySQL支持以下几个隔离级别 ...
    99+
    2024-04-02
  • SqlServer事务详解(事务隔离性和隔离级别详解) - 熊泽
    概述   不少人对于事务的使用局限于begin transaction:开始事务、commit transaction:提交事务、rollback transaction:回滚事务的初步运用。 并且知道使用事务后, 事务中所有操作命令必须...
    99+
    2019-10-07
    SqlServer事务详解(事务隔离性和隔离级别详解) - 熊泽
  • MySQL事务隔离级别
      四类隔离级别    SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。  Read Unc...
    99+
    2024-04-02
  • MySQL 事务的隔离级别
    1. 事务的ACID 事务的ACID是指事务拥有的4个特性的首字母组合:atomicity(原子性), consistency(一致性), isolation(隔离性)和durability(持久性)。 ①atomicity(原子...
    99+
    2019-01-27
    MySQL 事务的隔离级别
  • MySQL的事务隔离级别
    目录数据库事务的四大特性⑴ 原子性(Atomicity)⑵ 一致性(Consistency)⑶ 隔离性(Isolation)⑷ 持久性(Durability)SQL的4种隔离级别Read Uncommitted(读取未提交内容)R...
    99+
    2021-07-07
    MySQL的事务隔离级别
  • oracle之事务隔离级别
    本文小节了oracle中事务隔离级别。 ANSI SQL标准定义了4中隔离级别: READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZAB...
    99+
    2024-04-02
  • mysql事务隔离的级别
    这篇文章主要介绍“mysql事务隔离的级别”,在日常操作中,相信很多人在mysql事务隔离的级别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql事务隔离的级别”的疑惑...
    99+
    2024-04-02
  • 粗谈MySQL事务的特性和隔离级别
    网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言 ​  此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能MySQL》第三版中其对事务的描...
    99+
    2014-10-16
    粗谈MySQL事务的特性和隔离级别
  • 聊聊MySQL事务的特性和隔离级别
    网上对于此类的文章已经十分饱和了,那还写的原因很简单——作为自己的理解笔记。 前言   此篇文章作为自己学习MySQL的一些个人理解,使用的引擎是InnoDb。首先先讲讲事务的概念,在《高性能...
    99+
    2022-05-11
    MySQL 事务 MySQL 事务特性 MySQL 事务隔离级别
  • SQL级别事务隔离级别选择
    SQL中的事务隔离级别是指多个事务同时运行时,各个事务之间的隔离程度。SQL标准定义了四个事务隔离级别,分别是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。 R...
    99+
    2024-08-03
    sql
  • MySQL锁与事务隔离级别
    1、概述 (1)锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、IO等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据...
    99+
    2021-12-05
    MySQL锁与事务隔离级别
  • Mariadb之事务隔离级别 - Linux
    所谓原子性,就是事务中执行的语句要么全部执行,要么全部不执行,如果事务在中途发生错误,那么前面执行过的语句将会回滚到事务前;一致性指的是在执行事务之前和事务执行完成后的数据库状态是完整的;也就是说我们执行的语句都按照我们...
    99+
    2020-11-15
    Mariadb之事务隔离级别 - Linux
  • 事务的 4 个隔离级别
    一、事务的 4 个隔离级别 未提交读(Read Uncommitted):事务可以读取未提交的数据,也称作脏读(Dirty Read)。一般很少使用。 提交读(Read Committed):是大都是 DBMS (如:Oracle,...
    99+
    2016-08-30
    事务的 4 个隔离级别
  • MySQL基础——事务隔离级别
    事务是DBMS得执行单位。它由有限得数据库操作序列组成得。但不是任意得数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID) ①:原子性(Autmic):事务在执行性,要做到“要...
    99+
    2024-04-02
  • MySQL事务隔离级别详解
    一、什么是事务? 事务是逻辑上的一组操作,要么全执行,要么全不执行。 事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这...
    99+
    2023-08-30
    mysql
  • mysql事务隔离级别详情
    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab re...
    99+
    2024-04-02
  • 事务隔离级别通俗指南:轻松理解不同隔离级别
    事务隔离级别是数据库管理系统中用于保证事务正确执行的一项重要机制。它通过控制并发事务对共享数据的访问,来确保每个事务都能独立、正确地执行。事务隔离级别分为四个级别:读未提交、读已提交、可重复读和串行化。 读未提交(Read Uncommi...
    99+
    2024-02-23
    事务隔离级别 并发控制 数据库管理系统
  • 数据库事务:ACID 和隔离级别
    一、什么是事务 事务是将多条 SQL 作为一个整体进行数据操作。这样能确保全部执行成功或全部执行失败,不改变任何数据。根据业务需求选择不同的存储引擎。对于那些不需要事务的查询类应用,选择非事务型的存储引擎能得到更高的性能,LOCK TABL...
    99+
    2016-06-16
    数据库事务:ACID 和隔离级别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作