🌟前言
无论是在校招、社招,亦或者大学计算机专业、软件工程等相关面试或者考试中,MySQL事务的相关知识都是必不可少的。本文主要为MySQL初学者快速学习MySQL事务保驾护航。
🌟什么是事务
在维基百科中,对事务的定义是:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
- 事务的四大特性
事务包含四大特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)(ACID)。
- 原子性(Atomicity) 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。以转账场景为例,一个账户的余额减少,另一个账户的余额增加,这两个操作一定是同时成功或者同时失败的。
- 一致性(Consistency) 一致性是指数据库的完整性约束没有被破坏,在事务执行前后都是合法的数据状态。这里的一致可以表示数据库自身的约束没有被破坏,比如某些字段的唯一性约束、字段长度约束等等;还可以表示各种实际场景下的业务约束,比如上面转账操作,一个账户减少的金额和另一个账户增加的金额一定是一样的。
- 隔离性(Isolation) 隔离性指的是多个事务彼此之间是完全隔离、互不干扰的。隔离性的最终目的也是为了保证一致性。
- 持久性(Durability) 持久性是指只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态。
- 事务的状态
根据事务所处的不同阶段,事务大致可以分为以下5个状态:
- 活动的(active) 当事务对应的数据库操作正在执行过程中,则该事务处于
活动
状态。 - 部分提交的(partially committed) 当事务中的最后一个操作执行完成,但还未将变更刷新到磁盘时,则该事务处于
部分提交
状态。 - 失败的(failed) 当事务处于
活动
或者部分提交
状态时,由于某些错误导致事务无法继续执行,则事务处于失败
状态。 - 中止的(aborted) 当事务处于
失败
状态,且回滚操作执行完毕,数据恢复到事务执行之前的状态时,则该事务处于中止
状态。 - 提交的(committed) 当事务处于
部分提交
状态,并且将修改过的数据都同步到磁盘之后,此时该事务处于提交
状态。
🌟事务的定义及作用
定义:事务是一个不可再此分割的最小工作单元。换句话说事务通常代表一个完整的业务或者业务线。通俗来说,一个业务功能所包含的操作,要么全部成功,要么全部失败。
作用:
- 为数据库的操作或者一个完整的业务功能提供一个从失败操作中恢复到正常状态的方法,同时保证数据库操作在异常状态下保持一致性。
- 防止多个应用程序并发访问数据库时,多个应用程序间的操作产生干扰,影响业务功能的正常性。
🌟事务的特性(ACID)
- 原子性(Atomicity):事务必须是最小的工作单元,一个事务中的所有操作,应该做到:要么全部成功,要么全部失败,否则回滚到初始状态。
- 一致性(Consistency):事务在开始和结束时,数据必须保持一致状态。通俗说就是让数据保持逻辑上的“合理性”,比如:小明给小红打100块钱,既要让小明的账户减少100,又要让小红的账户上增加100块钱;
- 隔离性(Isolation):事务的隔离性确保并发执行的事务彼此之间相互隔离,每个事务都感觉不到其他并发事务的存在。独立执行,互不干扰。
- 持久性(Durability):事务一旦执行成功,数据将会永久保存到数据库中。
🌟事务的隔离级别
隔离级别一览表
隔离级别 | 描述 | 现象 |
读未提交(Read Uncommitted) | 最低隔离级别,一个事务可以读取另一个未提交事务的数据。 | 脏读、不可重复读、幻读都可能发生。 |
读已提交(Read Committed) | 一个事务只能读取已提交事务的数据。 | 脏读不会发生,但不可重复读和幻读仍然可能发生。 |
可重复读(Repeatable Read) | MySQL默认隔离级别,一个事务在执行过程中多次读取同一行的数据结果都是一致的 | 脏读和不可重复读不会发生,但幻读仍然可能发生。 |
串行化(Serializable) | 最高隔离级别,对于同一份数据资源同时只允许一个事务进行读写操作。 | 脏读、不可重复读和幻读都不会发生。 |
隔离级别举例解读
我们下面来对每个隔离级别,提出具体的例子进行解读,供大家理解。所有的例子都以下表为基础。串行化就不做出具体例子说明了。
id | product_name | price |
1 | 手机 | 1000 |
2 | 电脑 | 2000 |
3 | 平板 | 800 |
读未提交
1.A查询价格表:select * from price;
2.B修改价格表中平板的价格为100,但是并未提交
:update set price=100 where id=3;
3.A再次查询价格表时,平板的价格会显示100。
读已提交
1.A查询价格表:select * from price;
2.B修改价格表中平板的价格为200,并提交
:update set price=200 where id=3;
3.A再次查询价格表时,平板的价格会显示200。
可重复读
1.A查询价格表:select * from price;
2.B修改价格表中平板的价格为300,并提交
:update set price=300 where id=3;
3.A查询价格表时,平板的价格依然是原数据
80。
🌟事务控制语句
控制语句 | 描述 |
BEGIN 或 START TRANSACTION | 开始一个新的事务 |
COMMIT | 提交当前事务的修改,使其生效,并永久保存到数据库中 |
ROLLBACK | 回滚当前事务的修改,取消事务所做的所有修改 |
SAVEPOINT savepoint_name | 创建一个保存点,用于回滚到特定的保存点 |
RELEASE SAVEPOINT savepoint_name | 删除指定的保存点 |
ROLLBACK TO SAVEPOINT savepoint_name | 回滚到指定的保存点,并取消保存点之后的所有修改 |
我正在参与 腾讯云开发者社区数据库专题有奖征文。