首页 > 数据库 >数据库事务的四种隔离级别

数据库事务的四种隔离级别

时间:2023-01-31 15:56:38浏览次数:59  
标签:小明 事务 隔离 幻读 数据库 提交 级别 四种

1.引言

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交) 、Read committed (读已提交)、Repeatable read (重复读)、Serializable (序列化)。读现象是在多个事务并发执行时,在读取数据方面可能碰到的问题。包括脏读、不可重复读、幻读。

脏读:读到了脏数据,即无效数据。

不可重复读:是指在数据库访问中,一个事务内的多次相同查询却返回了不同数据。

幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。

备注:不可重复读对应的是修改,即update操作。幻读对应的是插入操作。幻读是不可重复读的一种特殊场景。

要想解决脏读、不可重复读、幻读等读现象,那么就需要提高事务的隔离级别。但是随之带来的,隔离级别越高,并发能力越低。所以,需要根据业务去进行衡量,具体场景应该使用哪种隔离级别。

下面通过事例一一阐述它们的概念与联系。

2.事务隔离级别

2.1 Read uncommitted(读未提交)

提供了事务建最小限度的隔离。顾名思义,就是一个事务可以读取另一个未提交事务的数据。

示例:小明去商店买衣服,付款的时候,小明正常付款,钱已经打到商店老板账户,但是小明发起的事务还没有提交。就在这时,商店老板查看自己账户,发现钱已到账,于是小明正常离开。小明在走出商店后,马上回滚差点提交的事务,撤销了本次交易曹邹。

结果:小明未付钱买到了衣服,商店老板实际未收到小明的付款。

分析:商店老板查看自己的资金账户,这个时候看到的是小明还没有提交事务的付款。这就是脏读。

注意:处于该隔离级别的事务A与B,如果事务A使用事务B不提交的变化作为计算的基础,然后哪些未提交的变化被事务A撤销,这就导致了大量的数据错误变化。

2.2 Read committed (读已提交)

处于Read committed (读已提交)级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的同一sql在其他事务执行前后返回的是不同的结果。一个事务要等另一个事务提交后才能读取数据。

示例:小明卡里有1000元,准备与几个朋友聚餐消费,消费1000元,当他买单时(事务开启),收费系统检测到他卡里有1000元。就在检测完毕的时候,小明女朋友发现小明有私房钱,全部转走并提交。当收费系统准备扣款时,再检查小明卡里的金额,发现已经没钱了,付款不成功。小明此时就会很纳闷,明明有钱的呀,钱呢?

分析:该示例中同一个事务范围内两个相同的查询却返回了不同数据,这就是不可重复读。该隔离级别可以解决脏读问题。

2.3 Repeatable read (重复读)

在开始读取数据(事务开启)时,不再允许修改操作

示例:还是小明有1000元,准备跟朋友聚餐消费这个场景,当他买单(事务开启)时,收费系统检测到他卡里有1000元,这个时候,他的女朋友不能转出金额。接下来,收费系统就可以扣款成功了,小明醉醺醺的回家,准备跪脱衣板。

分析:重复读可以解决不可重复读的问题,这句话有些别扭,大家可以仔细品一下。

写到这里,大家可能会产生疑问,什么情况下产生幻读呢?

示例来了:

小明在公司上班,女朋友告诉他,拿着他的卡去逛街消费。花了一千元,然后小明去查看他银行卡的消费记录(事务开启),看到确实是花了一千元。就在这个时候,小明女朋友又花三千元买了一些化妆品和衣服,即新增了一些消费记录。当小明打印自己银行卡消费记录单的时候(女朋友事务提交),发现花了四千元,似乎出现了幻觉,小明很心疼。这就是幻读

扩展:当我们开启一个事务以后,有如下的程序操作

第一步:更新A表id=1的记录

第二步:查询A表id=1的记录

第三步:使用第二步的查询结果作为依据继续业务逻辑

第四步:提交事务

问题来了:同一个事务中,事务未提交前,第二步的查询结果是第一步执行前的结果还是第一步执行后的结果呢?

答案:事务隔离级别是针对不通事务的,同一事务中的未提交的更新,在后续是可以查询到的。

2.4 Serializable (序列化)

数据库事务的最高隔离级别。在此级别下,事务串行执行。可以避免脏读、不可重复读、幻读等读现象。但是效率低下,耗费数据库性能,不推荐使用。

3.mysql事务隔离级别查询

3.1mysql查看数据库实例默认的全局隔离级别sql

Mysql8以前:SELECT @@GLOBAL.tx_isolation, @@tx_isolation;

Mysql8开始:SELECT @@GLOBAL.transaction_isolation, @@transaction_isolation;

3.2修改隔离级别命令:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

建议开发者在修改时,仅修改当前session隔离级别即可。

3.3mysql默认隔离级别

REPEATABLE-READ,可以避免脏读,不可重复读,不可避免幻读
————————————————
版权声明:本文为CSDN博主「Allen----Liu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/airingyuan/article/details/127112563

标签:小明,事务,隔离,幻读,数据库,提交,级别,四种
From: https://www.cnblogs.com/sunchenxuan/p/17079438.html

相关文章

  • APITable:免费开源的多维表格与可视化数据库,上线1天斩获GitHub星标1000+
    前言 vika维格表将70万行代码开源了。 更为准确地说,我们正式发布了vika维格表的社区版——「APITable」。这意味着,你可以通过免费开源的多维表格技术去创造更多......
  • JNDI学习总结(三):tomcat下使用c3p0数据库连接池配置JNDI数据源
    tomcat是apache的,所以它的JNDI数据源默认使用commons组件的DBCP连接池来配置。如果想使用c3p0来配置数据源,就需要修改<Resource>标签里的部分配置选项,操作如下: 1.肯定......
  • 检测sqlite3数据库的完整性
    1/**2*@integrityCheck3*@brief检查数据库的完整性4*5*@paramdbPath数据库的路径6*@返回值0:完整;-1损坏7*/8intintegrityCheck(......
  • 区块链leveldb数据库安装
    一、首先,需要在电脑上安装boost库。下载地址在这里,下载压缩包之后解压,Indexofmain/release/1.79.0/source。解压完成后在解压好的文件夹里面进入cmd,之后运行bootstrip.......
  • 快速使用时序数据库InfluxDB
    快速使用时序数据库InfluxDBInfluxDB是一款优秀的时间序列数据库,适合存储设备性能、日志、物联网传感器等带时间戳的数据。1. InfluxDB主要特性InfluxDB也就是TSDB,是......
  • PostgreSQL学习笔记-1.基础知识:创建、删除数据库和表格
    PostgreSQL创建数据库PostgreSQL创建数据库可以用以下三种方式:1、使用CREATEDATABASESQL语句来创建。2、使用createdb命令来创建。3、使用pgAdmin工具。例如,我......
  • [etcd]基本数据库操作
    前言etcd数据库操作基本围绕着对键值和目录的CRUD操作,以及生命周期的管理。之前在单节点部署了三实例集群,而etcdctl默认找的是127.0.0.1:2379,所以这里先声明一个临时全局......
  • 使用 Python 操作 Mongo 数据库
    1.简介MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,它支持的......
  • 17.1 SQL Server数据库邮件
    SQLServer数据库邮件目录SQLServer数据库邮件简介配置SQLServer数据库邮件使用数据库邮件发送邮件1)发送邮件示例2)发送带有查询结果的电子邮件简介数据库电子邮件可以......
  • 宝塔部署 宝塔远程连接数据库出现1045问题
    宝塔远程连接数据库出现1045问题宝塔面板在安装好mysql后本地navicat远程连接的时候报错1045这个问题是数据库权限问题在宝塔面板页面找到软件商店—已安装—mysql—......