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。办公区在访问服务器区时采用匿名认证的方式进行上网行为管理。办公区…

Vue内嵌套层级过深,el-input改变值视图无响应

出现场景 1.v-for内绑定复杂类型数据内部值,通过input更改其值时。 2.element表单或表格等组件内部,el-input绑定复杂类型数据内部值,通过input更改其值时。 解决思路 1.el-input加入 input“change($event)” … import { getCurrentInst…

【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层的简化版本: 在基…

鸿蒙自定义组件内自定义构建函数

参数传递规则 自定义构建函数的参数传递有按值传递和按引用传递两种,均需遵守以下规则: 参数的类型必须与参数声明的类型一致,不允许undefined、null和返回undefined、null的表达式。在自定义构建函数内部,不允许改变参数值。如…

8-Docker网络命令之connect

1.connect介绍 Docker网络命令connect是用来将容器连接到网络。 2.connect用法 docker network connect [参数] NETWORK CONTAINER [root@centos79 ~]# docker network connect --helpUsage: docker network connect [OPTIONS] NETWORK CONTAINERConnect a container to a…

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

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

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

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

如何保证消息队列不丢失消息(以kafka为例)

目录 一、引言 二. 持久化存储 2.1持久化存储原理: 2.2使用示例: 1. 安装 Kafka: 2. 生产者代码: 3. 消费者代码: 三. 消息确认机制 3.1消息确认机制原理: 3.2使用示例: 1. 生产者代码…

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

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

Win32 MDI 程序学习1

这个是从 Windows程序设计第五版 改来的;我还没完全理解;先初步看一下; #include <windows.h> #include "resource.h"#define INIT_MENU_POS 0 #define HELLO_MENU_POS 2#define IDM_FIRSTCHILD 50000LRESULT CALLBACK FrameWndProc(HWND, UINT, WP…

vue实现甘特图

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

JQuery下载和一些语法

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

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

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

Denoising diffusion implicit models 阅读笔记2

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

MyBatis 的一对多查询可以通过在 <resultMap> 标签中使用 <collection> 标签,将查询结果映射成 Java 对象的嵌套集合。

MyBatis 的一对多查询可以通过在 <resultMap> 标签中使用 <collection> 标签&#xff0c;将查询结果映射成 Java 对象的嵌套集合。具体步骤如下&#xff1a; 在 <resultMap> 中使用 <collection> 标签 在 <resultMap> 标签中使用 <collecti…