SQL - 事务控制

news2024/11/16 3:31:16

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.coloradmin.cn/o/1411479.html

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

相关文章

HH44X-16微阻缓闭式止回阀常见的问题

HH44X-16微阻缓闭式止回阀常见的问题 HH44X-16微阻缓闭式止回阀常遇问题包括以下几点: 一、泄漏: HH44X-16微阻缓闭式止回阀在关闭时可能会发生泄漏,导致介质倒流。泄漏可能由于密封失效、阀门磨损或堵塞等原因造成。 二、堵塞:…

复盘_用工具提升效率

流量池 从 2017 年 10 月,我开始写公众号,一直以来都是零零散散地写,读者也只是随随便便地看。而今年在连续日更了 10 天后,我获得了今年的第一次流量池推荐。 尽管和别人动辄十万百万的阅读量没法比。但是,考虑到我的…

echarts 绘制垂直滚动热力图

问题1:提示功能无效 问题2:值筛选无效 效果 在线浏览 下载echarts官网例子(heatmap Examples - Apache ECharts) 稍作改动: generateData 入参改为长度和宽度noise.perlin2(i / 40, j / 20) Math.random() * 5y轴倒置指定zlevel为2 通过定…

如何使用Jellyfin+cpolar搭建私人影音平台实现无公网ip远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

2024年广东省安全员A证第四批(主要负责人)证模拟考试题库及广东省安全员A证第四批(主要负责人)理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年广东省安全员A证第四批(主要负责人)证模拟考试题库及广东省安全员A证第四批(主要负责人)理论考试试题是由安全生产模拟考试一点通提供,广东省安全员A证…

HCIE之BGP路由策略(三)

BGP 一、路由控制工具ACLIP-PREFIXRoute-Policy 二、BGP路由控制通过更改MED属性调节选路通过更改Local_Pref属性调节选路理解ACL、IP-PREFIX和Route-Policy中permit、deny的含义 三、BGP属性特点-团体属性练习no-advertise属性ORF 一、路由控制工具 在对BGP进行路由控制之前&…

你认识哪几种树结构

二叉树,B,B,B*,R树 二叉树 使用二分结构存储数据,查找数据时,耗时最好可达到O(log2N)。但是二叉树没有平衡的特性,所以在经过一系列的增删后,可能会出现极端的情况,耗时…

利用Python实现中文文本关键词抽取的三种方法

文本关键词抽取,是对文本信息进行高度凝练的一种有效手段,通过3-5个词语准确概括文本的主题,帮助读者快速理解文本信息。目前,用于文本关键词提取的主要方法有四种:基于TF-IDF的关键词抽取、基于TextRank的关键词抽取、…

代理模式-C#实现

该实例基于WPF实现,直接上代码,下面为三层架构的代码。 目录 一 Model 二 View 三 ViewModel 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练…

像搭乐高一样把模型拼在一起

琳琅满目的乐高积木,通过一块又一块的叠加,可以创造出各种栩栩如生的人物、景观等,不同的乐高作品相互组合,又能为爱好者带来新的创意。 我们把思路打开一点,在大模型(LLM)爆发的当下&#xff0…

SpringBlade微服务开发平台

采用前后端分离的模式,前端开源两个框架:Sword (基于 React、Ant Design)、Saber (基于 Vue、Element-UI)后端采用SpringCloud全家桶,并同时对其基础组件做了高度的封装,单独开源出一个框架:BladeToolBladeTool已推送至…

Nginx部署、Jenkins自动发布、搜索服务概述、ES部署与使用、消息队列概述、RabbitMQ部署及使用

案例1:HIS前端代码测试 Fontend主机部署Nginx #HIS前端代码为编译后代码,可直接部署在nginx上查看效果[rootFontend ~]# yum clean all; yum repolist -vTotal packages: 8,265[rootFontend ~]# yum -y install nginx.x86_64 #安装nginx…

第13章_泛型(集合中使用泛型,比较器中使用泛型,自定义泛型结构,泛型在继承上的体现,通配符的使用)

文章目录 第13章_泛型(Generic)本章专题与脉络1. 泛型概述1.1 生活中的例子1.2 泛型的引入 2. 使用泛型举例2.1 集合中使用泛型2.1.1 举例2.1.2 练习 2.2 比较器中使用泛型2.2.1 举例2.2.2 练习 2.3 相关使用说明 3. 自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接…

[git] windows系统安装git教程和配置

一、何为Git Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 二、git安装包 有2种版本,Git for Windows Setup和Git for Windows Portable(便携版)两个版本都可以。 三、Git for Windows Por…

【GPU】深入理解GPU硬件架构及运行机制

深入理解GPU硬件架构及运行机制 作者:Tim在路上​ 曾看到有一篇名为《The evolution of a GPU: from gaming to computing》的文章。 这篇文章非常热烈的讨论了这些年GPU的进步,这引发了我们的一些思考: 为什么我们总说GPU比CPU要强大,既然…

ISCTF2023 RE FloweyRSA WP

64位无壳,但是进去连main函数都没有 这里应该是main的头部 这里是一个jmp的花指令 jnz short labela 跳转到labela是一段没用的代码 所以把它和labela全部NOP 往下翻,又是必然跳转至label1 把jz short label1到db 0的花指令全部NOP label3这里也是类似的…

【mongoDB】下载与安装教程

目录 1. 下载 2.安装 3.启动 mangoDB是否启动成功 ? 1. 下载 官网地址:https://www.mongodb.com/try/download/community 2.安装 3.启动 在此输入命令操作数据库 mangoDB是否启动成功 ? 在浏览器访问:http://127.0.0.1:27017/ 出现该页面表示m…

jQuery之ajax发送请求(table数据)

一般后端给我们的数据是这样的 比如下面是所有学员信息 访问网址:http://localhost:8080/student/all 前端,我们需要通过点击查询所有学员信息即可显示到下面列表中, 给查询全部学员按钮设置点击事件,点击就发送请求 $("…

Python模块与包:扩展功能、提高效率的利器

文章目录 一、引言1.1 模块与包对于Python开发的重要性1.2 Python作为拥有丰富生态系统的编程语言 二、为什么学习模块与包2.1 复用代码:利用现有模块与包加速开发过程2.2 扩展功能:通过模块与包提供的功能增强应用的能力 三、模块的使用3.1 导入模块&am…

OPENMV驱动云台实现颜色追踪

前言 本篇文章旨在记录我电赛期间学习OPENMV对颜色识别,以及通过串口通信的方式将坐标数据传给单片机,从而驱动舵机云台进行颜色追踪。 一、OPENMV色块识别追踪代码 # Single Color RGB565 Blob Tracking Example # # This example shows off single co…