三十一、MySQL基础系列笔记之事务基础概念详解(上)
什么是MySQL事务
**事务(Transaction)是一个最小的不可再分割的工作单元,一个事务通常对应一个完整的事务。**一个事务中可以包含一条或多条SQL语句,这些语句么要么全部执行成功,要么都不执行,若有一条语句执行失败,那么其他SQL操作全部被回滚。事务一旦执行成功,就不可撤销。
举个栗子:张三要给李四转500块钱,张三的账户减少500块,李四的账户增加500,这一个过程不可被分割,要不全部执行成功才会成功赚钱。转账成功后突然反悔了,不想转了,那也没有办法对已经执行成功的事务进行回滚,如果想要会转出的500块钱,那么只有去和李四商量了。李四,赶紧把钱转回来给我~~~~
MySQL事务四大特性ACID
- 原子性(Atomicity):事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
- 一致性(Consistency):事务在完成时,必须使所有的数据都保持一致状态。也就是说必须保证同时成功或同时失败。
- 隔离性(Isolation):由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
- 持久性(Durability):事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
事务的隔离级别
**MySQL事务有四种隔离级别:**读未提交(Read Uncommitted)、读已提交(Read Commited)、可重复读(Repeatable Read)、串行(Serializable)。
**多个事务时可能会产生三种情况:**脏读(dirty read)、不可重复读(Non-repeatable read)、幻读(Phanton Read)。
脏读:A事务已经更新了数据但未提交事务,B事务此时读取数据时,读取到了A事务未插入的数据;
不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
幻读:在一个事务的两次查询中数据笔数不一致。
ead uncommitted 出现脏读、幻读、不可重复读
read committed 避免脏读、出现幻读和不可重复读
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
读已提交 | 否 | 是 | 是 |
可重复读 | 否 | 否 | 是 |
串行 | 否 | 否 | 否 |
支持事务的引擎
MySQL中只有InnoDB、NDB Cluster存储引擎支持事务,其它的存储引擎是不支持事务的。
事务的自动提交
MySQL默认开启了事务的自动提交。实际上增加改查都使用到了事务,只不过使用的是隐式提交。因此要实现转账这样的功能就要将事务改为手动提交,也是关闭自动提交。
事务的使用方法
辅助命令
# 查看事务开启状态
show variables like '%AUTOCOMMIT%';
# 查看事务隔离级别
select @@transaction_isolation;
注意:查看事务隔离级别,8.0.3以上版本使用transaction_isolation,而8.0以下版本使用tx_isolation
事务的使用方法,严格按照步骤来
# 第一步:关闭自动提交
set autocommit =0;
# 开启事务,[可选]
start transaction;
# 第二步:设置事务隔离级别
set session transaction isolation level Read Uncommitted;
# 第三步:sql语句
# 第四步:COMMIT或ROOLBACK
2020-11-22