Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式


◆ 博主名称: 小此方-CSDN博客 大家好,欢迎来到小此方的博客。
⭐️Mysql系列个人专栏: 【主题曲】Mysql
⭐️此方的GitHub: github_此方
⭐️ Re系列专栏:我们思考 (Rethink) · 我们重建 (Rebuild) · 我们记录 (Record)


文章目录

  • 概要&序論
  • 一、CURD不加控制,会有什么问题?
  • 二、什么是事务?
    • [2.1 事务的应用场景](#2.1 事务的应用场景)
    • [2.2 并发环境下的挑战](#2.2 并发环境下的挑战)
    • [2.3 事务的四大属性(ACID)](#2.3 事务的四大属性(ACID))
      • [2.3.1 原子性](#2.3.1 原子性)
      • [2.3.2 一致性](#2.3.2 一致性)
      • [2.3.3 隔离性](#2.3.3 隔离性)
      • [2.3.4 持久性](#2.3.4 持久性)
    • [2.4 为什么会出现事务](#2.4 为什么会出现事务)
    • [2.5 事务的操作方法与注意事项](#2.5 事务的操作方法与注意事项)

概要&序論

  Hello大家好,我是此方,MYSQL的CURD如果不加以管理会发生什么?MYSQL如何处理多请求并发问题?本文将为大家带来MYSQL的事务相关内容。好,我们开始吧。

一、CURD不加控制,会有什么问题?

  当客户端A检查还有一张票时,将票卖掉,还没有执行更新数据库时,客户端B检查了票数,发现大于0,于是又卖了一次票。然后A将票数更新回数据库。这是就出现了同一张票被卖了两次。

CURD满足什么属性,能解决上述问题?

  1. 买票的过程得是原子的。
  2. 买票互相应该不能影响。
  3. 买完票应该要永久有效。
  4. 买前,和买后都要是确定的状态。

二、什么是事务?

  事务就是一组 DML 语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

2.1 事务的应用场景

  事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。

  假设一种场景:你毕业了,学校的教务系统后台 MySQL 中,不在需要你的数据,要删除你的所有信息,那么要删除你的基本信息(姓名,电话,籍贯等)的同时,也删除和你有关的其他信息,比如:你的各科成绩,你在校表现,甚至你在论坛发过的文章等。

  这样,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。

2.2 并发环境下的挑战

  正如我们上面所说,一个 MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包装成事务,在向 MySQL 服务器发起事务处理请求。而每条事务至少一条 SQL,最多很多 SQL,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。甚至,因为事务由多条 SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

2.3 事务的四大属性(ACID)

  所以,一个完整的事务,绝对不是简单的 SQL 集合,还需要满足如下四个属性:

2.3.1 原子性

  一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

2.3.2 一致性

  在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

2.3.3 隔离性

  数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

2.3.4 持久性

  事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

上面四个属性,可以简称为ACID 。

  • 原子性(Atomicity,或称不可分割性)
  • 一致性(Consistency)
  • 隔离性(Isolation,又称独立性)
  • 持久性(Durability)。

2.4 为什么会出现事务

  事务被 MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型 ,不需要我们去考虑各种各样的潜在错误和并发问题。可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?

  因此事务本质上是为了应用层服务的,而不是伴随着数据库系统天生就有的。

  备注:我们后面把 MySQL 中的一行信息,称为一行记录。

  在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。

2.5 事务的操作方法与注意事项

2.5.1如何查看是否是手动提交还是自动提交

  可以通过以下 SQL 语句来查看当前 MySQL 客户端的自动提交状态:

sql 复制代码
show variables like 'autocommit';

  如果查询结果中的 Value 为 ON,则表示当前处于自动提交状态;如果为 OFF,则表示处于手动提交状态。

  也可以通过 set autocommit = 0; 来关闭自动提交,或者用 set autocommit = 1; 来开启自动提交。

2.5.1 完整的事务操作方法

  开始事务可以使用 start transaction 或者 begin。

  提交事务使用 commit。

  回滚事务使用 rollback。

2.5.2 事务操作的核心结论

  只要输入 begin 或者 start transaction,事务便必须要通过 commit 提交,才会持久化 ,与是否设置 set autocommit 无关。

  事务可以手动回滚,同时,当操作异常,MySQL 会自动回滚。

  对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交。(select 有特殊情况,因为 MySQL 有 MVCC)。

  从上面的例子,我们能看到事务本身的原子性(回滚),持久性(commit)。

  那么隔离性?一致性?我们后面再讲。

2.5.3 事务操作的注意事项

  如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)。

  如果一个事务被提交了(commit),则不可以回退(rollback)。

  可以选择回退到哪个保存点。

  InnoDB 支持事务,MyISAM 不支持事务。

  开始事务可以使 start transaction 或者 begin。

2.5.4设置/删除/回滚到回滚点

sql 复制代码
savepoint sp1;
release savepoint sp1;
rollback to savepoint sp1;
相关推荐
csdn_aspnet29 分钟前
macOS 10 、Docker 玩轉 MySQL
运维·mysql·macos·docker·容器·mac
flash俊杰1 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
王中阳Go2 小时前
100 件货卖出 116 件,库存停在 -16
后端·mysql·go
2501_933923252 小时前
redis:string类型常见命令
数据库·redis·缓存
byte轻骑兵3 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛4 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5204 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
古典和浪漫5 小时前
MVCC机制
数据库
xixingzhe25 小时前
mysql全量、增量备份
数据库·mysql