数据库事务

目录

一.事务

1.为什么要存在事务

2.什么是事务

3.事务的特性(ACID)

4.MySQL中事务的使用

二.事务的隔离级别

1.什么是隔离级别

2.隔离级别的分类

3.不同隔离级别的现象

4.MySQL中设置隔离级别

5. 四种隔离级别和锁

1.READ-UNCOMMITED

2.READ-COMMITED

3.REPEATABLE-READ

4.SERIALIZABLE


一.事务

1.为什么要存在事务

刚开始我们拿一个常见的操作来说明我们为什么需要事务.假如现在张三给李四转账100元,我们需要先把张三账户的钱减少100,然后再把李四账户的钱增加100.但是如果张三账户的钱减少100的时候突然发生网络异常,那么张三减少了100,但是李四却没有增加100,这个时候就会出现问题了.

update accout set money=money-100 where name='张三'

update accout set money=money+100 where name='李四'

为了避免这种问题的发生,因此出现了事务(transaction)

2.什么是事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败
就比如我们上面的转账的例子,当没有出现网络异常的时候,我们两条语句都执行成功,这个事务就成功执行写入到数据库了(commit),当出现了网络异常的时候,第一条语句成功执行,但是第二条语句没有成功执行,那么第一条语句的数据不会写入到数据库(rollback).

3.事务的特性(ACID)

  1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

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

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

  4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

4.MySQL中事务的使用

我们可以通过start transaction来开启事务 通过rollback来回滚数据,通过commit来提交数据

案例:对于这样一张accout表

1.发生错误rollback数据的情况;

start transaction;
update accout set money=money-100 where name='张三'
#发生网络错误
rollback; 

表中数据未发生改变

2.未发生错误commit数据

start transaction;
update accout set money=money-100 where name='张三';
update accout set money=money+100 where name='李四';
commit;

表中数据发生改变:

之前我们都进行过修改,添加和删除操作,这些语句都直接修改了表中的数据.那么大胆推测以下,每一条语句都是一个事务,执行完这一条语句都自动提交到了数据库中.

事实就是如此,我们可以通过以下语句来验证我们的推测.

show variables like '%commit%';

 我们可以看到autocommit=on.

我们可以通过以下语句来设置不自动提交(不推荐)

set autocommit = 0;  #0-->OFF  1-->ON

二.事务的隔离级别

1.什么是隔离级别

MySQL是以服务的形式发布到网络上的,如果有多个用户对一个表进行操作,那么他们之前的操作可能会发生相互影响的情况.

隔离级别:隔离级别是数据库中用于控制并发访问数据一致性的一种机制。当多个事务同时访问数据库时,会出现一些并发问题,如脏读、不可重复读和幻读。隔离级别定义了一个事务对于另一个事务所做的修改的可见性和影响范围,从而保证数据的一致性和正确性。

2.隔离级别的分类

这张表具象的描述了四种隔离级别的描述

 这张表表明了四种隔离级别可能出现的问题和解决的问题

这四种隔离级别从上到下的安全性越来越好,但是性能越来越差

3.不同隔离级别的现象

  • 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段。之后, 若 T2 回滚, T1读取的内容就是临时且无效的。

  • 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段。之后, T1再次读取同一个字段, 值就不同了。

  • 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行。之后, 如果 T1 再次读取同一个表, 就会多出几行。

4.MySQL中设置隔离级别

查看MySQL中默认的隔离级别

select @@tx_isolation;

#或者

show variables like 'tx_isolation';

修改默认的隔离级别

set @@global.tx_isolation = '隔离级别' ; // 全局
set @@session.tx_isolation = '隔离级别' ; // 当前 session
set @@tx_isolation = '隔离级别' ;// 仅对下⼀个事务生效

 案例:修改隔离级别为READ-UNCOMMITTED

set @@global.tx_isolation = 'READ-UNCOMMITTED' ; // 全局
set @@session.tx_isolation = 'READ-UNCOMMITTED' ; // 当前 session
set @@tx_isolation = 'READ-UNCOMMITTED' ;// 仅对下⼀个事务生效

注意:设置了全局的隔离级别之后,需要重启客户端之后才能生效

5. 四种隔离级别和锁

先来建立一个user表

create table user(
id int,
name varchar(20)
);

1.READ-UNCOMMITED

这种情况下用户读到了没有被commit的数据,接来下我们测试read-uncommited隔离级别下可能发生的情况.

我们先把MySQL的隔离级别设置为READ-UNCOMMITED

set @@global.tx_isolation = 'READ-UNCOMMITTED';

#重启客户端之后再来查询隔离级别,否则不生效
show variables like 'tx_isolation';

显示这样表示修改成功.

接下来我们打开两个客户端(终端) 

初始状态客户端一和客户端二都只含有四条数据.

我们在客户端一开启事务,并且向表中添加一条数据.

START TRANSACTION;

INSERT INTO USER(id,NAME) VALUES(5,'czj');

SELECT * FROM USER;

此时客户端表中的数据为左图所示

我们在客户端二查询数据,发现数据和表一种的数据一模一样.

此时我们在客户端一rollback操作,查询数据

此时数据为这样

然后我们在客户端二在进行查询操作

数据也变成了这样

客户端二读取到了客户端一还没有commit的数据,这种情况称之为脏读,因为客户端一可能进行rollback操作,所以客户端二读到的没有commit的数据是无效的,因此这种情况使我们一定要避免产生的.

流程图:

 案例:这就相当于作者在CSDN中发表了一篇文章,读者读取到了这一篇文章,但是这个时候作者对这篇文章进行了修改(还没有提交),读者刷新一下,发现了修改的内容,但是作者发现修改不好,就放弃了修改(相当于rollback),读者又刷新了一下,发现修改的内容又恢复了原样.

2.READ-COMMITED

针对READ-UNCOMMITED出现的问题,READ-COMMITED这种隔离级别可以很好的解决.

首先我们将数据库的隔离级别设置为READ-COMMITTED

set @@global.tx_isolation = 'READ-COMMITTED';

#重启客户端之后再来查询隔离级别,否则不生效
show variables like 'tx_isolation';

当出现这种情况的时候表示隔离级别设置成功

我们同样执行上面的操作,发现没有commit之前客户端二的数据都是这样就成功的解决了脏读的问题.

READ-COMMITED到底是如何解决脏读的问题呢,其实在这种隔离级别下,我们在事务中加入了一把读锁,这个时候从其他的客户端是无法读取到这个客户端事务中的内容的,只能读取到事务开启之前的内容,当rollback/commit操作的时候,这个时候读锁解除.

 但是这种隔离级别下也会出现问题,下面我们来模拟

我们在客户端一中开启事务查询用户信息

START TRANSACTION;
SELECT * FROM USER;

 查询到的数据如图

这个时候我们在客户端二也开启一个事务,修改数据,并且将commit操作

 START TRANSACTION;
UPDATE USER SET NAME='xcl' WHERE id=4;
COMMIT;
SELECT * FROM USER;

客户端二的数据如图.

此时我们在客户端一(事务还没有结束)查询user的信息

SELECT * FROM USER;

 客户端一的数据如图

以上所描述的类型就是不可重复读

以上操作的流程图

但是事务的原子性的特性,一个事务中的数据是一个整体,怎么可能一个事务中查询到数据不同呢.

案例:这就相当于作者在CSDN中发表了一篇文章,读者读取到了这一篇文章,但是这个时候作者对这篇文章进行了修改,并且进行了提交,读者刷新一下,就发现了修改的内容.

3.REPEATABLE-READ

针对READ-COMMITED出现的问题,REPEATABLE-READ这种隔离级别可以很好的解决.

首先我们将数据库的隔离级别设置为REPEATABLE-READ

SET @@global.tx_isolation = 'REPEATABLE-READ';

#重启客户端之后再来查询隔离级别,否则不生效

SHOW VARIABLES LIKE 'tx_isolation';

出现这种情况表示设置成功

 我们同样执行以上的操作,发现

在客户端一的事务没有结束之前,查询到的数据都为左表所示

REPEATABLE-READ这种隔离级别通过给事务加上读锁,这样客户端一种查询只能查询到开启事务时的数据(也就是加锁的时候),之后改变的数据无法进入到读锁开启到结束的这段时间(也就是这段事务的期间),因此这期间内读到的数据都是一样的,这样成功解决了不可重复读的问题.

MySQL数据事务的默认隔离级别虽然是可重复读,但是最⼤限度的解决了幻读问题,但是并没有完全解 决,有些场景还是会出现幻读现象,这个大家心里⼀个认识,如果要彻底解决幻读问题,那么只能 事务的隔离级别设置成SERIALIZABLE,也就是串行化.
在目前的版本中测试不出来幻读的问题,我们只需要知道幻读是结果集不一样了就行了
刚开始我们在客户端一开启事务并查询所有用户信息:

START TRANSACTION;

SELECT * FROM USER;

    客户端一显示这些信息

客户端二:

SELECT * FROM USER;

START TRANSACTION;

INSERT INTO USER(id,NAME) VALUE(5,'xcl');

COMMIT;

SELECT * FROM USER;

   客户端二显示这些信息

然后再从客户端一查询信息(此时客户端一的事务还没有结束)

  客户端一显示这些信息

 当客户端一执行commit操作(事务结束),然后查询

没有出现幻读现象,说明REPEATABLE-READ已经解决了一部分的幻读问题,MySQL默认的隔离等级为REPEATABLE-READ已经很合理了.

4.SERIALIZABLE

针对REPEATABLE-READ出现的问题,SERIALIZABLE这种隔离级别可以很好的解决.

我们将数据库的隔离级别设置为SERIALIZABLE

SET @@global.tx_isolation = 'SERIALIZABLE';

#重启客户端之后再来查询隔离级别,否则不生效

SHOW VARIABLES LIKE 'tx_isolation';

 这样可以彻底解决幻读问题.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端实现可拖拽课程表【纯HTML、CSS、JS】

前言 hello,今天实现点小动画,帮助学习理解Web api的拖拽效果,这里实现的是可拖拽的课程表!# 效果图 附:作者没钱去除水印,就这样看一下简单的看一下效果吧! 实现前言知识 这里我使用事件委…

区间合并(算法)

目录 题目代码实现注意点 题目 给定 n n n 个区间 [ l i , r i ] [l_i, r_i] [li​,ri​],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如: [ 1 , 3 ] [1,3] [1,3] 和 [ 2 , 6 ] [2,…

Maven POM和Maven构建配置文件操作笔记

目录 我到现在还是没有太搞懂Maven的作用,我只是有一个模糊的概念就是它可以添加很多的依赖,这样会使项目搭建起来更加方便,你可以谈谈你的看法吗? Maven POM 父(Super)POM POM 标签大全详解 Maven 构建…

DSP:数字信号处理的原理及应用

什么是DSP?DSP一般有两种解释: 1、Digital Signal Processing,数字信号处理技术,简称DSP。是一门涉及许多学科而又广泛应用于许多领域的新兴学科。数字信号处理是围绕着数字信号处理的理论、实现和应用等几个方面发展起来的。数字…

如何用u盘重装系统win7

​如今的U盘重装win7系统是比较常见的重装win7系统的方法,适用性比较高,操作也十分的简单。有的小伙伴想给自己的电脑重装win7,那么我们用u盘重装系统怎么安装win7?现在小编就来教大家如何用u盘重装系统教程。 工具/原料: 系统…

git commit 设置 eslint + pretter 格式化校验

系统版本 node 版本: v14.17.5 npm 版本: 6.14.14 vue-cli 版本: vue/cli 4.5.19 目录 系统版本 1. 新建一个 vue2.X 空项目 2. 安装插件 eslint ,并初始化 eslint 配置,根目录生成 .eslintrc 配置文件 3. 测试 eslint 配置 4. 安装 husky、lint-staged 5. 在package.j…

使用svg在元素直接绘制连线箭头

注意&#xff1a;svg的图形绘制的点位置坐标是基于画布的位置坐标&#xff0c;相当于从左上角的点为起点。 先来个简单示例&#xff1a; 在点与点之间绘制连线箭头 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

ChatGPT学习-如何向ChatGPT提问

​ 最近在学习chatGPT,怎么样的提问是一个好的提问。通过网上找资料肯定不是最好的方法&#xff0c;我想起一句话&#xff0c;“不识庐山真面目&#xff0c;只缘身在此山中”。最好的老师就是chatGPT&#xff01; 下面先展示下提问成果&#xff0c;我通过xmind生成了思维导图 一…

科思转债上市价格预测

科思转债 基本信息 转债名称&#xff1a;科思转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;7.249178亿元。 正股名称&#xff1a;科思股份&#xff0c;今日收盘价&#xff1a;67.1元&#xff0c;转股价格&#xff1a;53.03元。 当前转股价值 转债面值…

电脑断电文件丢失如何找回?给你支几招!

电脑断电文件丢失如何找回&#xff1f;我好不容易熬夜加班做的活动方案&#xff0c;正当将U盘文件转移到笔记本电脑的时候&#xff0c;没有注意笔记本的电量&#xff0c;在转移数据的过程中突然断电了。我的电脑一下子就“熄”了&#xff0c;方案都没来得及保存。这真是一个悲剧…

MySQL主从复制与读写分离

目录 一、mysql主从复制原理1.1 mysql的复制类型1.2 mysql主从复制的工作原理 二、mysql读写分离原理2.1 读写分离的意义2.2 常见的两种mysql读写分离2.2.1.基于程序代码内部实现2.2.2.基于中间代理层实现2.2.3 amoeba 2.3 mysql读写分离原理 三、mysql数据库四种同步方式3.1 异…

MySQL视图详解

我写本文主要目的&#xff0c;是在网上看见了 所以&#xff0c;文本主要探讨的问题如下&#xff0c;验证结果在最后面 一、修改视图&#xff0c;基表会跟着改吗&#xff1f;答案&#xff1a;会改变 二、修改基表&#xff0c;视图会变化吗&#xff1f;答案&#xff1a;会改变 …

Nevron Open Vision for .NET 2022.3 Crack

Nevron Open Vision for .NET 适用于 Blazor、WPF、WinForms 和 Xamarin.Mac 的领先用户界面组件 Nevron Open Vision for .NET 是一套高级 UI 组件&#xff0c;可帮助您从单个代码库开发功能丰富的 Web &#xff08;Blazor WebAssembly&#xff09; 和桌面 &#xff08;WinFor…

手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(上篇)

1. 前言 说起RNN和LSTM&#xff0c;就绕不过Sepp Hochreiter 1997年的开山大作 Long Short-term Memory。奈何这篇文章写的实在是太劝退&#xff0c;整篇论文就2张图&#xff0c;网上很多介绍LSTM的文章都对这个模型反向传播的部分避重就轻&#xff0c;更少见&#xff08;反正…

照片尺寸怎么调整大小?三个方法,高效、快捷、安全!

照片尺寸怎么调整大小&#xff1f;照片是我们在日常生活和办公中经常会使用的文件类型之一。在制作各种文件、讲义、PPT、视频等内容时&#xff0c;图片都会成为重要的一部分。不同的图片格式和大小各有特点&#xff0c;有些图片虽然比较大但画质清晰&#xff0c;有些则方便传输…

网络安全公司Dragos披露网络安全事件

工业网络安全公司 Dragos 披露了它所称的“网络安全事件”&#xff0c;此前一个已知的网络犯罪团伙试图突破其防御并渗透到内部网络以加密设备。 虽然 Dragos 表示威胁行为者没有破坏其网络或网络安全平台&#xff0c;但他们可以访问公司的 SharePoint 云服务和合同管理系统。…

Windows系统下Chromedriver.exe安装及配置

Windows系统下Chromedriver.exe安装及配置 在利用selenium工具进行Web自动化测试时&#xff0c;必须先要安装浏览器驱动&#xff0c;通常比较常用的是谷歌浏览器和火狐浏览器。 一、浏览器驱动下载地址 1.浏览器驱动官网&#xff1a;http://chromedriver.storage.googleapis…

【Midjourney】Midjourney 的 Prompt 指令类型 ( 画风指令 | 人物细节指令 | 灯光镜头指令 | 艺术家风格指令 )

文章目录 一、Midjourney 的 Prompt 详细指令规则二、Midjourney 的画风指令关键词1、超现实主义2、注重细节描写3、Artstation 画风4、数字绘画风格5、漫画风格6、线条艺术 三、Midjourney 的人物细节描写关键词1、面部特征描写2、身体描写3、生成示例 14、生成示例 2 四、Mid…

(MIT6.045)自动机、可计算性和复杂性-DFA和NFA

毕业论文写完了。找点事干干。 佛系更新。 这是一门讲述 什么是计算&#xff1f;什么能被计算&#xff1f;怎么高效计算&#xff1f; 的哲学、数学和工程问题的课程。 主要包括&#xff1a; 有限状态机&#xff08;Finite Avtomata&#xff09;&#xff1a;简单的模型。 可…

在Linux中进行Jenkins部署(maven-3.9.1+jdk11)

Jenkins部署在公网IP为x.x.x.x的服务器上 maven-3.9.1要安装在jdk11环境中 环境准备 第一步&#xff0c;下载jdk-11.0.19_linux-x64_bin.tar.gz安装包。 登录地址&#xff1a;Java Downloads | Oracle 下载jdk-11.0.19_linux-x64_bin.tar.gz安装包&#xff0c;然后使用Win…
最新文章