MySQL的事务与隔离级别

1. 什么是事务?

数据库中的事务是指对数据库执行一批操作,而这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。这个时候就需要用到事务。

最经典的例子就是转账,你要给朋友小白转 1000 块钱,而此时你的银行卡只有 1000 块钱。

转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 1000 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。

简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败

2.事务的几个特性(ACID)

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。

原子性(Atomicity)

事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。

一致性(Consistency)
一个事务必须使数据库从一个一致性状态变换到另一个一致性状态。

所谓一致性,指的是数据处于一种有意义的状态,这种状态是语义上的而不是语法上的。最常见的例子是转帐。例如从帐户A转一笔钱到帐户B上,如果帐户A上的钱减少了,而帐户B上的钱却没有增加,那么我们认为此时数据处于不一致的状态。

隔离性(Isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(Durability)
一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。

3.如何开启事务

 事务分为隐式事务显式事务。

隐式事务

mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。

是否开启隐式事务是由变量autocommit控制的。

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.01 sec)--autocommit为ON表示开启了自动提交

显式事务

  1. 显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback
  2. set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

 建议你总是使用 set autocommit=1, 通过显式语句的方式来启动事务。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update test set name='sss' where id=7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.01 sec)

4.隔离级别 

当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题。

(1)脏读:一个事务读到另外一个事务没有提交的数据

解释:例如两个并发的事务a和b,其中事务A查完数据库中的一条记录后,事务a继续修改了一条记录,此时事务A并未提交,此时并发事务b读取了事务a修改的记录,这就导致事务b读取到事务a未提交的数据

(2)不可重复读:一个事务先后读取同一条记录,但是两次读取的数据不同

解释:例如两个并发事务a和b,其中事务a读取数据库中的一条记录后,事务b对数据库的这条记录进行修改后,提交事务b,此时事务a继续读取这条记录,发现和上次读取的数据不一样

(3)幻读:一个事务按照条件查询数据,没有对应的数据行,准备插入数据时,发现这行数据存在

解释:例如两个并发事务a和事务b,其中事务a读取了id=1的数据时,发现没有这条记录,然后事务b插入id=1的数据,并且提交了事务b,此时事务a准备插入id=1的数据时发现已经存在这条数据,因为插入数据时报错,显示有这条记录

不可重复读,关注是其他事务修改数据并提交了事务,前后两次读取到的数据不一致的问题;幻读是新插入的行或删除行导致出现的问题

解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

为了解决这些问题,就有了“隔离级别”的概念。 

mysql中一共有4中隔离级别,其中可重复读是默认级别

  • 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

 上面4中隔离级别越来越强,会导致数据库的并发性也越来越低。

--查看隔离级别(两条任一条都行,这是查询当前会话的)
show variables like 'transaction_isolation';
select @@transaction_isolation;--查看全局隔离级别
SELECT @@GLOBAL.TRANSACTION_ISOLATION;--设置隔离级别
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }--MySQL的session和global一般使用在终端,用来对配置进行暂时设置,当数据库服务重启就会失效。session和global体现在新的设置生效的范围。
--session:当前会话,也就是当前连接立即生效。
--global:全局,不包含当前连接,之后新获取的连接都会生效。

5.隔离级别的演示

 每个隔离级别可能出现的问题如下 

 读未提交级别

出现脏读

 读已提交级别

解决脏读,出现不可重复读问题。

步骤5更新数据后还未提交,到步骤6查看,数据没有改变,说明读已提交解决了脏读问题。

而步骤6和步骤8查看的数据是不一致的,这个就出现了不可重复读问题。(在同一个事务先后读取同一条记录,但是两次读取的数据不同)。

 可重复读级别

解决不可重复读问题,出现幻读。

解决了不可重复读问题,步骤3,6,8读到的数据都是一致的。在步骤9提交后,步骤10读到的数据就是更新后的数据。

出现幻读。

步骤3查看是没有id=7的行,步骤4中插入id=7的行(步骤4是隐性提交),步骤5中再次查看还是没有。之后步骤7插入数据,出现错误。这就是出现了幻读。幻读是针对新插入的行的

步骤8提交后,步骤9中查看可以看到另一事务插入的id=7的数据了。

可串行化级别

解决所有问题,但也是性能最差的一个

步骤5中会一直被卡住,等到超时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2813073.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

JMeter学习(一)工具简单介绍

一、JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务…

swagger-ui.html报错404,解决办法

swagger-ui.html报错404,解决办法!现在后端开发项目中,为了节省时间,使用swagger插件,可以方便的快捷生成接口文档。但是如果你在请求前端页面路径比如:http://127.0.0.1:7777/swagger-ui.html。找不到。那是因为你的配…

GEE错误——sentinel-2数据处理过程出现‘QA60‘ did not match any bands

在GEE中出现"QA60 did not match any bands"错误的原因可能是因为在GEE中搜索的数据信息中找不到与"QA60"相匹配的波段。这可能是由于以下几个原因导致的: 1. 数据库中没有包含"QA60"波段的信息。如果影像使用的日期较为新,可能会导致无法在…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息:单机K3s 1.28.2 操作系统…

Rust-windows安装环境

文章目录 前言一、Using rustup (Recommended)二、配置vscode解决办法:在终端依次运行如下两条指令: 总结 前言 Rust学习系列,之前介绍了macOS环境下的rust安装方式macOS rust安装。这篇学习windows的rust安装方式。 提示:以下是…

注解@requestBody @requestParam@RequestHeader的区别和使用方式

总的来说,RequestBody用于接收请求体数据,RequestParam用于获取请求参数,RequestHeader用于获取请求头信息 requestBody requestBody 通常在POST请求中,用于指示一个方法参数应该绑定到Web请求的正文部分。通常用于接收JSON或XM…

几种常见的数据模型

什么式数据模型:数据如果要被存储记录或者分析,要有一个组织形式,那么,怎么把数据按照一定规律组织呢,这个就是数据模型数据模型分类 平面模型:或者称为二维模型,通过行列坐标确定数据的形式 纵…

银河麒麟桌面版操作系统密码复杂度设置

这里是桌面版的使用,资深使用者可以使用命令一键修改,这里面不涉及 1密码复杂度设置 1.1开始菜单,选择设置 快捷键wini也可以 1.2打开账户设置 1.3在安全中心的账号保护中 1.4推荐的是默认的策略 密码强度使用默认推荐的就可以&#xf…

电脑缺失XInput1_4.dll文件的解决办法

在电脑操作中,有用户遇到了XInput1_4.dll文件缺失的问题,导致一些依赖该文件的电脑应用无法正常运行,从而影响用户正常使用。接下来小编分享不同的解决方法,帮助用户轻松解决该问题,找回XInput1_4.dll文件,…

单片机文件系统

下载地址 FatFs - Generic FAT Filesystem Module (elm-chan.org)

四川尚熠电子商务有限公司抖音带货可靠吗?

在当今数字化时代,电子商务的兴起使得越来越多的企业开始涉足这一领域。四川尚熠电子商务有限公司作为其中的一员,提供抖音带货服务,吸引了众多商家的关注。那么,四川尚熠电子商务有限公司的抖音带货服务究竟可靠吗?本…

分享泰国市场的一些现状

最近和一个泰国的客户聊天,然后聊起来说从去年开始很多的中国人来到他们那边去建设工厂,因此还在当地形成了一个中国村,在这个中国村里有中国的各种商店,而且居住的也主要是中国人。 从前年开始我们都在讨论中国的一些工厂可能因为…

算法--贪心

这里写目录标题 区间问题区间选点引入算法思想例题代码 最大不相交区间的数量算法思想例题代码 区间分组算法思想例题代码 一级目录二级目录二级目录二级目录 区间问题 区间选点 引入 区间问题会给定几个区间,之后要求我们在数轴上选取尽量少的点,使得…

掌握微信小程序开发的核心要点:从基础到进阶

文章目录 掌握微信小程序开发的核心要点:从基础到进阶一、数据绑定和事件处理1.1 理解小程序的数据绑定机制,实现数据和视图的同步更新1.2 学习如何处理用户交互事件和触发相应的响应逻辑 二、网络请求和数据交互2.1 使用小程序的网络请求API与后端服务器…

智能充电桩案例分析——交流充电桩

随着电动汽车的发展,充电桩也成为当下的一个很热门的工业产品。我们初步接触充电桩,有了点滴的感受。 先简单说说容易一点的交流充电桩。就是通过市电(220V,50赫兹)给电动汽车提供充电的能源来源。很容易理解,交流…

亿道丨三防平板丨如何从多方面选择合适的三防加固平板?

在如今这个信息爆炸的时代,移动设备已经成为我们生活和工作的必备工具。然而,在一些特殊的场合中,普通的平板电脑可能无法满足需求,比如工厂车间、野外作业、极端天气等环境下。此时,三防平板就成了不二之选。那么&…

以太网中的Pause帧格式

一、PAUSE帧概念 PAUSE帧是以太网在全双工模式下,MAC控制子层发出的流量控制帧。IEEE802.3协议为MAC控制子层提供了一个全双工流量控制结构框架,MAC控制子层是介于逻辑链路控制子层和介质访问控制子层间的可选功能。 交换控制电路要防止缓冲区溢出&…

黑马瑞吉外卖练习笔记

day2 员工管理 完善登录 问题:用户不登录,直接访问系统首页,照样可以正常访问。我们希望,只有登录成功后才可以访问系统中的页面,如果没有登录则跳转到登录页面 怎么实现? 用过滤器或拦截器,在…

阿里云文件验证方式申请SSL证书的教程

文件验证方式申请SSL免费证书 ***.com.cn 下载验证文件然后解压出来 将验证文件放到通过域名的80端口能访问到的地方:E:\deploy\dygw.well-known\pki-validation 验证文件返回的内容

【代码+图解+解析】校门外的树

文章目录 问题描述输入格式输出格式输出要求输入样例输出样例解题思路图示Java代码C代码C代码Java代码输出结果 问题描述 某校大门外长度为 L的马路上有一排树,每两棵相邻的树之间的间隔都是 1米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置…