SQL - 事务控制

SQL - 事务控制

文章目录

  • SQL - 事务控制
    • TCL - 事务
      • 事务的边界
      • 事务的特性
      • 事务的应用
    • 事务隔离等级
      • MySQL支持四种隔离级别

TCL - 事务

**模拟场景:**生活当中转账是转账方账户扣钱,收账方账户加钱。用数据库操作来模拟现实转账。

数据库模拟:

  • A账户减1000元
UPDATE account SET MONEY = MONEY-1000 WHERE id=1;
  • B账户加1000元
UPDATE account SET MONEY = MONEY+1000 WHERE id=2;

思考: 假设在A账户减钱后,程序出现了异常,那B账户还会执行加钱操作吗?

每条SQL语句都是一个独立的操作,执行成功后对数据库是永久性的影响。

概念:

  • 事务是一个原子操作,由一个或多个SQL语句组成。
  • 在同一个事务当中,所有的SQL语句要么全部执行成功,要么全部失败。

原理:

  • 数据库会为每一个客户端都维护一个空间独立的缓存区(回滚段)。
  • 一个事务中所有的增删改语句的执行结果都会缓存在回滚段中。
  • 当事务中所有SQL语句均正常结束,才提交(commit),才会将回滚段中的数据同步到数据库。
  • 否则无论因为哪种原因失败,整个事务将回滚(rollback)。

事务的边界

**开始: **

  • 默认连接到数据库,隐式开始事务,每条语句执行完自动提交或回滚。
  • 手动使用begin; 或 start transaction; 显示开启事务,不会自动提交或回滚。
  • set autocommit=0; #禁止自动提交。

begin 和 set autocommit=0 的区别

在这里插入图片描述

结束:

  • 提交:
    • 显式提交:commit;
    • 隐式提交:一条DML语句,正常提交(客户端退出连接)。
  • 回滚:
    • 显式回滚:rollback;
    • 隐式回滚:非正常退出(断电、宕机)。执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。

事务的特性

1 Atomicity(原子性)

  • 表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。

2 Consistency(一致性)

  • 表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态。

3 Isolation(隔离性)

  • 事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态。
  • 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

4 Durability(持久性)

  • 持久性事务完成之后,它对于系统的影响是永久性的。

事务的应用

基于增删改语句的操作结果,可通过程序逻辑手动控制事务提交或回滚。

应用事务完成转账:

开启事务:begin;start transaction;set autocommit=0;#禁止自动提交 ,默认为1
事务内数据操作语句:UPDATE ACCOUNT SET MONEY = MONEY-1000 WHERE ID = 1;UPDATE ACCOUNT SET MONEY = MONEY+1000 WHERE ID = 2;
事务内语句都成功了,提交:commit;
事务内如果出现错误,回滚:rollback;

代码演示:

#创建表
create table account(id int primary key auto_increment,name varchar(20) not null,money decimal(12,2)
)charset=utf8mb4
#添加数据
insert into account values(null,'张三',10000),(null,'李四',0);
select * from account;#显示开启事务 begin; 或 start transaction;
# begin;
set autocommit=0; #禁止自动提交
#转账
# 1 扣钱
update account set money=money-1000 where name='张三';
# 2 加钱
update account set money=money+1000 where name='李四';#显示提交[成功]
commit;
#显示回滚[失败]
rollback;
set autocommit=1;#开启自动提交

事务隔离等级

操作:

  • select @@tx_isolation; #查看隔离级别
  • set session transaction isolation level [隔离级别] #修改隔离级别

MySQL支持四种隔离级别

1 Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,称之为脏读(Dirty Read)。

2 Read Committed(读取提交内容)

大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别出现不可重复读(Nonrepeatable Read)问题,因为同一事务的其他实例在该实例处理期间可能会有新的commit,所以同一select可能返回不同结果。

3 Repeatable Read (可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻读” 行。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了该问题。

4 Serializable(串读)

最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。效率最低的。

代码演示:

#查看隔离级别, 默认隔离级别: REPEATABLE-READ 可重复读
select @@tx_isolation;
# 1 设置隔离为 read uncommitted 读取未提交, 问题: 脏读
set session transaction isolation level read uncommitted;# 2 设置隔离级别为 read committed 读取提交, 问题: 不可重复读
set session transaction isolation level read committed;# 3 设置隔离级别为 repeatable read 可重复读, 问题: 幻读 (MySQL没有)
# 开启事务后不被外界影响
set session transaction isolation level repeatable read;
# 需求: 统计每天的收入情况
BEGIN;select * from account where name = '李四'; select * from account where name = '李四'; select * from account where name = '李四'; #入账
COMMIT;# 4 设置隔离级别为 serializable 串读 没有问题, 但性能低
set session transaction isolation level serializable;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CI/CD

介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…

软件设计师——软件工程(五)

📑前言 本文主要是【软件工程】——软件设计师——软件工程的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1f304…

安全防御综合组网实验

题目 要求 生产区在工作时间可以访问服务器区,仅可以访问http服务器。办公区全天可以访问服务器区,其中10.0.2.20 可以访问FTP服务器和http服务器。10.0.2.10仅可以ping通10.0.3.10。办公区在访问服务器区时采用匿名认证的方式进行上网行为管理。办公区…

【RabbitMQ】死信(延迟队列)的使用

目录 一、介绍 1、什么是死信队列(延迟队列) 2、应用场景 3、死信队列(延迟队列)的使用 4、死信消息来源 二、案例实践 1、案例一 2、案例二(消息接收确认 ) 3、总结 一、介绍 1、什么是死信队列(延迟队列) 死信,在官网中对应的单词…

Unity学习之坦克游戏制作(2)游戏场景的制作

文章目录 1. 基础场景的搭建2. 游戏主面板2.1 拼出面板2.2 创建新面板2.3 设置面板复用2.4 退出界面 3. 坦克基类3.1 创建基类脚本3.1.1 基类基本属性3.1.2 抽象开火函数3.1.3 受伤虚函数3.1.4 死亡虚函数 4 玩家——基础移动旋转摄像机跟随4.1 玩家对象脚本4.2 控制坦克移动4.…

移动端打包成功后禁止生成 report.html 文件,并不自动打开该文件

目录 【问题】移动端 npm run build 打包后生成并打开 report.html 文件package.json 文件vue.config.js 代码 【解决】打包后去除 report.html 文件vue.config.js 代码 参考 【问题】移动端 npm run build 打包后生成并打开 report.html 文件 package.json 文件 {"name&…

蓝牙----蓝牙协议栈L2CAP

蓝牙协议栈----L2CAP L2CAP的功能术语介绍L2CAP信道L2CAP的工作模式经典蓝牙的分段和分解过程 L2CAP—逻辑链路控制和适配层协议 L2CAP的功能 经典蓝牙的L2CAP层实现了协议复用、数据分段与重组、封装调度等操作。BLE的L2CAP层是经典蓝牙L2CAP层的简化版本: 在基…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台(实现) (仅供学习,本案例只是分析流程没有账号)网址:https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台,并勾选保存日志,然后点击登录看发送了什…

ICSpector:一款功能强大的微软开源工业PLC安全取证框架

关于ICSpector ICSpector是一款功能强大的开源工业PLC安全取证框架,该工具由微软的研究人员负责开发和维护,可以帮助广大研究人员轻松分析工业PLC元数据和项目文件。 ICSpector提供了方便的方式来扫描PLC并识别ICS环境中的可疑痕迹,可以用于…

Unity配置表xlsx/xls打包后读取错误问题

前言 代码如下: //文本解析private void ParseText(){//打开文本 读FileStream stream File.Open(Application.streamingAssetsPath excelname, FileMode.Open, FileAccess.Read, FileShare.Read);//读取文件流IExcelDataReader excelRead ExcelReaderFactory…

vue实现甘特图

目录 实现效果 一、安装依赖 二、使用 二、绕过license 实现效果 一、安装依赖 npm i --save vue-gantt-schedule-timeline-calendar 实现甘特图需先安装上述依赖,安装依赖实际上是通过gantt-schedule-timeline-calendar来实现的。所以node_module中因包含以下…

JQuery下载和一些语法

最近学了六种jQuery选择器,我想把学过案例和知识结合起来,给大家分享下! 那么既然学jQuery选择器,肯定要先了解下jQuery是什么吧!jQuery是一个快速、简洁的JavaScript框架,相当于用jQuery能更加高效的创建…

【快影】怎么制作卡拉OK字幕

您好,您添加了字幕之后可以添加动画,选择卡拉OK,其中 卡拉OK1是支持修改颜色的,卡拉OK2只支持修改文字的底色。

Denoising diffusion implicit models 阅读笔记2

Denoising diffusion probabilistic models (DDPMs)从马尔科夫链中采样生成样本,需要迭代多次,速度较慢。Denoising diffusion implicit models (DDIMs)的提出是为了在复用DDPM训练的网络的前提下,加速采样过程。 加速采样的基本思路是&#…

geemap学习笔记052:影像多项式增强

前言 下面介绍的主要内容是应用Image.polynomial() 对图像进行多项式增强。 1 导入库并显示地图 import ee import geemap ee.Initialize() Map geemap.Map(center[40, -100], zoom4)2 多项式增强 # 使用函数 -0.2 2.4x - 1.2x^2 对 MODIS 影像进行非线性对比度增强。# L…

创建第一个 Spring 项目(IDEA社区版)

文章目录 创建 Spring 项目创建一个普通的 Maven 项目添加 Spring 依赖IDEA更换国内源 运行第一个 Spring 项目新建启动类存储 Bean 对象将Bean注册到Spring 获取并使用 Bean 对象 创建 Spring 项目 创建一个普通的 Maven 项目 首先创建一个普通的 Maven 项目 添加 Spring 依…

全面解析开源大语言模型:BLOOM

大型语言模型 (LLM) 的兴起一直是自然语言处理 (NLP) 领域的一个决定性趋势,导致它们在各种应用程序中的广泛采用。然而,这种进步往往是排他性的,大多数由资源丰富的组织开发的 LLM 仍然无法向公…

什么是servlet

什么是servlet 什么是servlet Servlet(Server Applet)是 Java Servlet 的简称,称为小服务程序或服务连接器,用 Java 编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据…

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 解题思路 这道题可以理解为,只能保证块内有序的情况下&#xf…

大模型学习笔记一:大模型应用开发基础

文章目录 一、大模型一些概念介绍 一、大模型一些概念介绍 1)产品和大模型的区别(产品通过调用大模型来具备的能力) 2)AGI定义 概念:一切问题可以用AI解决 3)大模型通俗原理 根据上文,猜测下…