(九)MySQL学习笔记——事务

Spring事务和MySQL事务详解面试 文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTEDSpring事务的隔离级别Spring 阅读详情

一、事务的概念

  • 事务:多条SQL语句组成一个执行单元,这些语句要么都执行成功,要么都执行失败。
  • 如果都执行成功则此事务执行成功;如果有一条执行失败则导致整个事务所有语句执行失败,整个事务回滚到执行前的状态。

二、如何使用事务

1.数据准备

首先设定场景——银行转账。简历一张account表存放账户信息。

-- 数据准备:创建银行账户信息表
CREATE DATABASE db10;
USE db10;
CREATE TABLE account(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20),
    money DOUBLE
);
-- 插入数据
INSERT INTO account VALUES (NULL,'小李',2000),
                           (NULL,'小王',1000),
                           (NULL,'小赵',5000);

在不使用事务的情况下,现在进行转账操作:

--  现有需求:小王给小李转账500元。
-- 如果不使用事务:
UPDATE account SET money = money - 500 WHERE name='小王';
UPDATE account SET money = money + 500 WHERE name='小李';
-- 如果第二句语句因为某些原因执行失败,那将导致小王的账户减少500,而小李的账户没有增加。

2.使用事务

  1. 先开启事务,记录回滚点,此时即将执行一组操作,要么同时成功,要么同时失败。
  2. 开始执行多条SQL语句。
  3. 结束事务:要么都成功,则提交事务;要么都失败,则回滚事务。
-- 使用事务:
START TRANSACTION; -- 先开启事务
-- 执行语句
UPDATE account SET money = money - 500 WHERE name='小王';
UPDATE account SET money = money + 500 WHERE name='小李';
SELECT * FROM account;
ROLLBACK; -- 有失败语句则 回滚事务
COMMIT; -- 都执行成功则 提交事务

三、事务的提交方式

事务的提交方式有两种:

  1. 自动提交(默认方式)
  2. 手动提交:执行完SQL语句后需要手动进行事务提交,不提交则不存储更改。
-- 事务的提交方式
-- 查询当前事务的提交方式:0为手动提交;1为自动提交
SELECT @@AUTOCOMMIT;
-- 修改事务的提交方式:
SET @@AUTOCOMMIT=1;

四、事务的四大特征(ACID)

  1. 原子性(Atomicity):事务包含的操作要么全部成功,成功后完全应用到数据库;要么全部失败,失败后不能对执行前的数据库造成任何影响。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变到另一个一致性状态。即事务执行前和执行后都必须处于一致性状态。例如:银行转账要保证转账前后总金额不能变。
  3. 隔离性(Isolcation):当多个用户并发访问数据库时,例如操作同一张表时,数据库为每一个用户单独开启事务,事务之间没有干扰,并发事务之间相互隔离。分为不同的隔离级别。
  4. 持久性(Durability):事务一旦提交,对数据库中的数据改变是永久性的。

五、事务的隔离级别

1.隔离级别概念

当事务并行时,为了保证各个事务之间是隔离的、独立的,不能相互影响,所以需要设置不同的隔离级别,保证事务之间的独立性。

2.四种隔离级别

隔离级别名称级别代码可能引发问题
读未提交read uncommitted脏读、不可重复读、幻读
读已提交read committed不可重复读、幻读
可重复读(默认级别)repeatable read幻读
串行化serializable无

自上而下隔离级别越来越高,数据越来越安全,但效率越来越低。

3.不同隔离级别可能引发的问题

问题现象
脏读在一个事务处理过程中读取了另一个未提交的事务中的数据 , 导致两次查询结果不一致
不可重复读是指在一个事务处理过程中读取了另一个事务中修改并已提交的数据, 导致两次查询结果不一致
幻读①查询某记录是否存在,不存在时准备插入此记录,但执行 insert 插入时发现此记录已存在,无法插入。②查询某数据发现不存在,此时执行删除操作,却发现删除成功

4.查询及修改事务隔离级别

-- 查询事务的隔离级别
SELECT @@TX_ISOLATION; -- MySQL8.0之前可用
SELECT @@TRANSACTION_ISOLATION; -- MqSQL8.0之后用这个

-- 修改数据库隔离级别,重新连接数据库刷新
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别名;

5.脏读、不可重复读、幻读问题测试

5.1 脏读问题测试

  • 隔离级别为读未提交,会产生脏读问题。
-- 1.读未提交级别 产生 脏读 问题
-- 修改数据库隔离级别为read uncommitted(读未提交)
SET GLOBAL TRANSACTION ISOLATION LEVEL read uncommitted;
-- 当前级别是read uncommitted

SELECT * FROM account;
START TRANSACTION; -- 开启事务,开始转账

UPDATE account SET money = money - 500 WHERE name='小王';
UPDATE account SET money = money + 500 WHERE name='小李';

-- 此时事务1转账已完成,但还未提交。此时事务2查询转账结果,查到转账后的结果,此时出现脏读。

ROLLBACK; -- 事务1回滚事务,事务2之前查到的数据是不正确的。

5.2 不可重复读问题测试

  • 隔离级别为读已提交,将产生不可重复读问题。

-- 2.读已提交级别 产生 不可重复读 问题
-- 修改数据库隔离级别为read committed
SET GLOBAL TRANSACTION ISOLATION LEVEL read committed;
-- 当前级别是read committed

SELECT * FROM account;
START TRANSACTION; -- 开启事务,开始转账

UPDATE account SET money = money - 500 WHERE name='小王';
UPDATE account SET money = money + 500 WHERE name='小李';

-- 此时事务1转账已完成,但还未提交。此时事务2查询转账结果,查到转账前的结果。

COMMIT; -- 事务1提交事务后,事务2再次查询转账结果,查到转账后的结果,两次结果不一致,出现不可重复读。
  • 隔离级别设为可重复读,解决不可重复读问题。
-- 3.可重复读级别 解决了 不可重复读 问题
-- 修改数据库隔离级别为repeatable read(可重复读、默认级别)
SET GLOBAL TRANSACTION ISOLATION LEVEL repeatable read;
-- 当前级别是repeatable read(默认级别),解决 不可重复读 问题

SELECT * FROM account;
START TRANSACTION; -- 事务1和2都开启事务。
-- 事务1开始转账
UPDATE account SET money = money - 500 WHERE name='小王';
UPDATE account SET money = money + 500 WHERE name='小李';

-- 此时事务1转账已完成,但还未提交。此时事务2查询转账结果,查到 转账前 的结果。

COMMIT; -- 事务1提交事务后,事务2再次查询转账结果,查到的还是 转账前 的结果。

-- 当事务2提交后再次查询,查到的是 转账后 的结果,避免了 不可重复读 问题。


5.3 幻读问题测试

  • 隔离级别为可重复读,产生幻读问题。
-- 4.可重复读级别 产生 幻读 问题
-- 当前级别是repeatable read(可重复读、默认级别)

SELECT * FROM account;
START TRANSACTION; -- 首先,事务1和2都开启事务。
-- 然后,事务1插入一条新数据——编号为4的小孙。
INSERT INTO account VALUES (4,'小孙',6000);

-- 此时事务1插入数据已完成,但还未提交,此时能查到新插入的数据。此时事务2查询表,查到 插入新数据前 的结果,于是事务2想插入这条新数据
-- 但是事务2此时会卡死,无法插入数据。
COMMIT; -- 事务1提交事务后,事务2直接报错:[23000][1062] Duplicate entry '4' for key 'account.PRIMARY'
-- 事务2很疑惑:明明没有这条数据,为何我添加不进去呢?

-- 当事务2提交后再次查询,查到的是 插入新数据后 的结果...出现幻觉了?
  • 隔离级别设为串行化,解决幻读问题。
-- 5.串行化解决了 幻读 问题
-- 修改数据库隔离级别为 serializable(串行化)
SET GLOBAL TRANSACTION ISOLATION LEVEL serializable;
-- 当前级别是:serializable(串行化)

SELECT * FROM account;
START TRANSACTION; -- 首先,事务1和2都开启事务。
-- 然后,事务1插入一条新数据——编号为4的小孙。
INSERT INTO account VALUES (4,'小孙',6000);

-- 此时事务1插入数据已完成,能查到新插入的数据,但还未提交。此时事务2查询表,会卡死,无法查询数据。
COMMIT; -- 事务1提交事务后,事务2立刻就查到了新插入的数据。
[SVA]SystemVerilog Assertion Property开发技巧总结 SystemVerilog Assertion开发技巧总结 一、在property中可以使用if-else条件语句 如下面的例子,根据misc_phy_12g_rx的取值,选择不同的判断语句 property ck1_en_rose_chk(); @(posedge clk) disable iff(~rst_n) ad_pn_ck1en & (current_state !== ST_IDLE) |->... 阅读详情

相关推荐

VS2022下OSG+OSGEARTH开发环境一键配置指南(Win10 x64+CMake自动化构建)

本文详细介绍了在VS2022环境下配置OSG和OSGEARTH开发环境的完整指南,包括软件下载、CMake自动化构建、编译实战及环境验证。通过一键配置脚本和常见问题解决方案,帮助开发者快速搭建3D开发环境,提升开发效率。

weixin_28828243的博客 405

九、mysql学习笔记——mysql事务机制及数据导入导出(六)

mysql学习笔记(六) 上一节学习了,本节将学习mysql的事务处理机制、临时表、数据导入、导出,查看mysql版本信息,mysql的数据安全问题等。 1、mysql事务 在数据管理系统中,封装一些固定的mysql语句,来实现对大批量数据的统一操作,如企业里由于某人离职需要删除该人的所有资料,包括:个人基本信息、工资、以往业绩等。这种统一的操作就称为“事务”。mysql事务的特点: ...

weixin_42678841的博客 398

DEA-Malmquist指数模型实战:从理论到应用的全流程解析

本文全面解析了DEA-Malmquist指数模型从理论到应用的全流程。文章详细阐述了该模型如何动态衡量效率随时间的变化,并将其分解为技术效率变化与技术进步,从而精准定位效率变动的根源。通过实战步骤演示了数据准备、软件操作(如DEAP 2.1)及结果解读,并结合水资源环境效率等案例,展示了其在包含非期望产出时的应用价值,为研究者进行动态效率分析提供了清晰指南。

b0c1d2的博客 220

MySQL学习笔记进阶篇(九)之事务

事务在我们做较为复杂的项目时都会用到,无论用什么数据库都会用到事务处理。MySQL 事务主要用于处理操作量大,复杂度高的数据。 事务的一些介绍: 事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。    - 支持连续SQL的集体成功或集体撤销。    - 事务是数据库的一个功能。    - MySQL需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成...

SpiderManSun的博客 277

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

金蝶EAS uploadlogo漏洞实战:如何快速检测你的系统是否受影响

本文详细解析了金蝶EAS uploadlogo任意文件上传漏洞的检测与防护方法,帮助企业安全团队快速识别系统风险。通过资产发现、漏洞验证和应急响应方案,有效防范财务数据泄露和系统入侵风险,提升企业整体安全防护能力。

weixin_29322553的博客 386

MySQL数据库学习笔记(九)—— SQL(事务)

事务的基本介绍 概念:如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败 操作 开启事务:start transaction 回滚:rollb 提交:commit // 事务管理代码 // 创建资金表账户 CREATE TABLE account( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), ...

miles-zh 343

第三节:Vben Admin登录对接后端login接口

上一节,我们梳理的Vben Admin登录功能接口的逻辑,本节开始正式开启后端的开发后端我们采用Python的Flask项目,Flask-SQLAlchemy管理数据库模型,Flask-Migrate进行模型迁移。参考版本如下:Flask3.0.23.1.1本节,我们已经开启的后端的开发,因为是主要介绍Vben Admin的登录逻辑,所以Flask开发这里只截取了部分主要代码。

cuiwin的专栏 4189

事务 mysql 视频_MYSQL进阶学习笔记九:MySQL事务的应用!(视频序号:进阶_21-22)...

知识点十:MySQL 事务的应用 (21-22)为什么要引入事务:为什么要引入事务这个技术呢?现在的很多软件都是多用户,多程序,多线程的。对同一表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子:A给B要划钱,A的账户是-1000元,B的账户是+1000元,这两个UPDATE语句必须作为一个整体来执行,不然A扣钱了,B没有加钱这种情况很难处理。什么存储过程类型支...

weixin_28728425的博客 107

OpenClaw人人养虾:发现与传输

客户端需要先"发现"Gateway 的地址和端口,才能建立连接。OpenClaw 支持多种发现(Discovery)和传输(Transport)机制。

王国平的博客 572

搭建AutoSAR开发环境

任何开发都需要一套开发环境,包括软硬件环境,笔者后续将介绍的是 NXP 的 S32K144 配套的开发板。接下来详细介绍怎么获取这些软硬件工具。仅供个人学习使用!

cfl927096306的博客 6105

【MySQL】事务

本篇文章全面解析了数据库事务的概念、作用及其核心操作。事务作为数据库管理的基本单位,确保了数据操作的一致性、完整性和可靠性。文章详细探讨了事务的定义、版本支持、提交方式以及常见操作,并通过一系列实验演示了事务的回滚机制及在不同情况下的数据表现。同时,深入剖析了事务隔离级别的概念、分类及作用,帮助理解不同隔离级别对数据库一致性和并发性能的影响。

是阿建吖! 5494

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532

MySQL系列之事务编程学习笔记

MySQL基础之事务编程学习笔记 在学习《MySQL技术内幕:SQL编程》一书,并做了笔记。本博客内容是自己学了《MySQL技术内幕:SQL编程》一章根据自己的理解做的笔记,内容和书本并不一致,不过书本实验都经过自己验证,基于MySQL5.7版本。做笔记的目的是方便自己复习,同时分享出来或许对其他人或许有点帮助 提到事务肯定会想到事务的4个特性ACID,要保证业务的正常使用,必须保证ACID,AC...

Nicky's blog 6302

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MySQL(九) 事务

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。

POSEidoNqs的博客 1235

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL Transaction(事务)学习笔记

一、资源入口 这次很快就找到了入口 在MySQL官方文档界面查找(MySQL Server—>MySQL Reference Manual—>选定自己的版本,当然也可以下载的 ) 不过说真的还是下载下来HTML比较方便点,打开Index.html就是目录了,我在其中搜索字段‘transaction’然后可以快速定位自己关心的内容。 我已经得到的信息glossary.html 词汇表 二、词汇表中关

我的学生时代 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL——事务

MySQL、事务

2303_78442132的博客 3948

Mysql(九) --- 事务

MySQL(九) --- 事务

xxhh156的博客 1146

漫谈MySQL九-MySQL中事务的使用

目录 一、SQL 标准中的四种隔离级别 二、MySQL 中的隔离级别 2.1.如何设置事务的隔离级别 2.1.1.使用GLOBAL 关键字(在全局范围影响): 2.1.2.使用 SESSION 关键字(在会话范围影响): 2.1.3.上述两个关键字都不用(只对执行语句后的下一个事务产生影响): 2.1.4.启动参数修改 三、MySQL事务的使用 3.1.事务基本语法 3.1.1.事务提交 3.1.2.事务回滚 3.1.3.事务提交 3.2.保存点 3.3.隐式提交 3.3...

b379685397的博客 839

Spring事务和MySQL事务详解

文章目录数据库事务事务是什么事务的四大特性MySQL事务隔离级别查看MySQL当前事务隔离级别MySQL默认操作模式为自动提交模式JDBC处理事务Spring事务Spring的事务传播PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORT...

Keep Moving 5万+

认识事务 MySQL学习笔记

比如说银行转账,你给张三转账,你的钱转出去了,但是张三却没收到,这个步骤出错了,那就要把钱撤销到初始的状态。这样,当你的一系列事务前包含了这START TRANSACTION或者BEGIN,你还是需要用COMMIT指令才能执行这些事务。可是刷新后,emp的表里没有出现王强,所有我们需要手动提交事务。个人理解:事务,是一组操作,不可分割,要么成功,要么失败。个人理解:事务无论做没做成功,就算是回滚了,也总会造成影响,产生永久的改变。当然,你也可以默认自动提交事务,但是有的事务你又想手动提交,该怎么办?

Gloudcea_Kirara的博客 411

学习笔记-MYSQL 事务

事务是访问并可能更新数据库中数据的一个执行单元,这个单元是由一条或多条语句组成,单元里的语句是相互依赖的。 这个单元里的SQL语句一起向系统提交,提交后要么都执行成功,要么都失败。

LearnTech_123的博客 1733

MySQL事务

事务本质就是一组SQL语句,理论上,事务本就不应该属于MySQL,而是应该在应用层上面,完成的一件事情,完成一系列相关操作的sql语句集合叫做事务假如说你从学校毕业了,那么学校教务系统,后台的MySQL中就不需要你的信息了,那么管理员会运行几条sql命令来输出你的(姓名,电话,籍贯等信息),同时还有一些sql操作输出你的成绩,这些操作组合起来,就构成了一个"事务"事务=原子性的操作多条的sql语句再比如:张三给李四转账200。

m0_61567378的博客 4421

MySQL的事务(Transaction)【学习笔记】

MySQL的事务(Transaction)【学习笔记】

sjhhshsh的博客 1160

Mysql学习笔记之事务

事务是数据库确保数据一致性的重要机制,具有原子性、一致性、隔离性和持久性四大特性。MySQL默认自动提交事务,也可手动控制事务提交或回滚。并发事务会产生脏读、不可重复读和幻读问题,数据库提供四种隔离级别(Read uncommitted、Read committed、Repeatable Read、Serializable)来解决这些问题。隔离级别越高数据越安全但性能越低,需根据实际需求合理设置隔离级别。可通过SQL语句查看和修改当前事务隔离级别。

weixin_43435307的博客 1052

2020.2.10C++学习笔记——C++操作Mysql事务机制(回滚)

C++学习笔记——C++操作Mysql事务机制(回滚) Mysql的事务机制(transaction) MySQL 事务主要用于处理操作量大,复杂度高的数据。数据库操作语句构成事务。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务一般用来管理 insert,update,de...

CQ的学习笔记 2368
上一篇: (八)MySQL学习笔记——触发器
下一篇: (十)MySQL学习笔记——数据库的存储引擎
MegaBytes
博客等级 码龄8年 45粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值