131.【MySQL_基础篇】(五)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 131.【MySQL_基础篇】

(六)、事务

1.事务简介

事务 是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即浙西操作要么同时成功,要么同时失败。

drop table if exists account;
create table account(
id int primary key AUTO_INCREMENT comment 'ID',
name varchar(10) comment '姓名',
money double(10,2) comment '余额'
) comment '账户表';
insert into account(name, money) VALUES ('张三',2000), ('李四',2000);

注意:

默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。

2.事务操作

(1).未出现异常下的事务

张三转账给李四

-- 事务 (张三给李四转账1000)
-- 1.查询张三账户余额
select *from account where name='张三';
-- 2.将张三账户余额-1000
update account set account.money=account.money-1000 where account.`name`='张三';
-- 3.将李四的余额+1000
update account set account.money=account.money+1000 where account.`name`='李四';

(2).出现异常下的事务

当张三转完账单之后,李四账户还没来得及收时,有一个错误

-- 事务 (张三给李四转账1000)
-- 1.查询张三账户余额
select *from account where name='张三';
-- 2.将张三账户余额-1000
update account set account.money=account.money-1000 where account.`name`='张三';
-- 3.将李四的余额+1000
圣诞树上的  -- 制造错误
update account set account.money=account.money+1000 where account.`name`='李四';

3.事务控制 - (第一种方法)

(1).事务管理方法

1.查看/设置事务提交方式

select @@autocommit;  #如果为1就是自动提交,如果为0就是不自动提交
set @@autocommit=0; #设置事务不自动提交。

2.设置完手动提交后,我们要进行手动提交

commit;  #事务提交

3.假如提交后出现了异常,我们可以执行这个语句进行回滚事务。

rollback;  #事务回滚
(2).事务提交示列
  1. 事务控制 - 手动提交(但是未提交)
-- 事务 (张三给李四转账1000)
select @@autocommit;
set @@autocommit=0;
-- 1.查询张三账户余额
select *from account where name='张三';
-- 2.将张三账户余额-1000
update account set account.money=account.money-1000 where account.`name`='张三';
-- 3.将李四的余额+1000
update account set account.money=account.money+1000 where account.`name`='李四';

  1. 事务控制 - 手动提交(进行提交)

单独 执行commit之后,以前编写的数据才会开始同步。

commit;
• 1

(3).事务回滚示列
  1. 执行有异常代码未回滚但已提交
-- 事务 (张三给李四转账1000)
select @@autocommit;
set @@autocommit=0;
-- 1.查询张三账户余额
select *from account where name='张三';
-- 2.将张三账户余额-1000
update account set account.money=account.money-1000 where account.`name`='张三';
-- 3.将李四的余额+1000
项目出现异常
update account set account.money=account.money+1000 where account.`name`='李四';
commit;

  1. 执行有异常代码回滚且已提交
rollback;

在提交之后执行回滚的话,数据并不会回滚。假如进行回滚的话,那么就不要执行提交了;如果执行提交的话,就不用执行回滚了。

rollback;  #先回滚后提交
• 1

4.事务控制 -(第二种方法)

第二种方式我们不需要设置成手动提交。

(1).事务方法

1.开启事务

start transaction 或 begin;

2. 提交事务

commit;

3.回滚事务

rollback;
(2).事务控制
-- 2. 方法
start transaction
-- 1.查询张三账户余额
select *from account where name='张三';
-- 2.将张三账户余额-1000
update account set account.money=account.money-1000 where account.`name`='张三';
-- 3.将李四的余额+1000
项目出现异常
update account set account.money=account.money+1000 where account.`name`='李四';
rollback;  #假如有错我们就进行回滚的操作 catch
commit;  #假如运行没有异常进行提交的操作

5.事务四大特性 (ACID)

(1).四大特性
  • 原子性: 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性:事务完成时,必须使用所有的数据都保持一致状态。
  • 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。

6.并发事务问题

(1).并发事务引起的三大问题
  1. 脏读: 一个事务读到另外一个事务还没有提交的数据。
  2. 不可重复读: 一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
  3. 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了幻影。
(2).三大问题详细介绍

1.脏读:(读取为提交的修改事务,且执行一次查询)

张三开启一个取钱的事务,已经从卡中取了1000,余额还剩1000,但是未关闭服务(也就是还未执行提交)。
这个时候张三老婆同时也开启了一个查询的事务,此时张三老婆查看余额已经读取到了余额1000元。                                                                                                            

2.不可重复读: (读取了提交的修改事务,且执行两次查询)

张三老婆正在查询银行卡余额发现有2000元,此时张三开启一个取钱的事务,从卡中取了1000 并提交了事务,
张三老婆再次查找余额,发现余额突然剩下1000了,于是急忙地找工作人员进行处理这个问题。                                                                                                            

3.幻读:(读取了提交的新增事务,且执行了一次查询和一次新增)

张三开启事务在办理一个员工的入职手续,由于工作习惯张三 先查询了一下这个员工是否办理过入职,发现没有
便去上个厕所了,但此时另一个同事把这个员工添加了进去并提交了事务,张三上完厕所回来便添加这个员工
发现提示这个员工已经存在,便再次查询了这个员工,发现依然没有。张三
大叫见鬼了!!!!!

7.事务隔离级别

(1).事务隔离级别
隔离级别 脏读 不可重复读 幻读
Read uncommitted
Read committed
Repeatable Read(默认)
Serializable
(2).查看/操作事务隔离级别

1.查看事务隔离级别

select @@transaction_isolation   #版本6.0+
select @@tx_isolation   #版本6.0一下

2.设置事务隔离级别

# 假如是session只对当前窗口有效,假如设置的是global那么全部窗口都有效
set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read | Serializable }
• 1
• 2

3.版本6.0一下用 select @@transaction_isolation 报错

(3).演示脏读
# global 全局都设置,session 设置当前窗口(会话)
set global transaction isolation level Read uncommitted;
select @@tx_isolation;

结果读取到了未提交的数据

(4).演示不可重复读

(5).演示幻读

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
存储 关系型数据库 MySQL
|
7月前
|
SQL 缓存 关系型数据库
|
7月前
|
存储 关系型数据库 MySQL
|
SQL 存储 关系型数据库
131.【MySQL_基础篇】(一)
131.【MySQL_基础篇】
58 0
|
7月前
|
SQL 存储 关系型数据库
6本值得推荐的MySQL学习书籍
本文是关于MySQL学习书籍的推荐,作者在DotNetGuide技术社区和微信公众号收到读者请求后,精选了6本值得阅读的MySQL书籍,包括《SQL学习指南(第3版)》、《MySQL是怎样使用的:快速入门MySQL》、《MySQL是怎样运行的:从根儿上理解MySQL》、《深入浅出MySQL:数据库开发、优化与管理维护(第3版)》以及《高性能MySQL(第4版)》和《MySQL技术内幕InnoDB存储引擎(第2版)》。此外,还有12本免费书籍的赠送活动,涵盖《SQL学习指南》、《MySQL是怎样使用的》等,赠书活动有效期至2024年4月9日。
2205 0
|
6月前
|
存储 关系型数据库 MySQL
|
7月前
|
SQL 关系型数据库 MySQL
【MySQL系列笔记】MySQL总结
MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数据库都支持这门语言。
299 8
|
7月前
|
关系型数据库 MySQL 数据库
【MySQL】:超详细MySQL完整安装和配置教程
【MySQL】:超详细MySQL完整安装和配置教程
17210 3
|
SQL 关系型数据库 MySQL
131.【MySQL_基础篇】(二)
131.【MySQL_基础篇】
95 0
|
7月前
|
存储 SQL 关系型数据库