文章目录
MySQL---- 事务(Transaction)
一、概述
事务就是用户定义的一系列数据库操作(DML),这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
例如:张三转账给李四,必须保证张三账户减少 8000,李四账户增加 8000,这两项操作必须全部成功,如何保证? 需要事务。
二、四大特征(ACID)
- 原子性(Atomicity):整个事务中的所有操作,必须作为一个单元全部完成(或全部取消)。
- 一致性(Consistency):在事务开始之前与结束之后,数据库都保持一致状态。
- 隔离性(Isolation):一个事务不会影响其他事务的运行。
- 持久性(Durability):在事务完成以后,该事务对数据库所作的更改将持久地保存在数据库之中,并不会被回滚。
三、事务中的一些术语:
- 事务(Transaction):一批操作(一组 DML)
- 开启事务(Start Transaction)
- 回滚事务(rollback)
- 提交事务(commit)
- SET AUTOCOMMIT:禁用或启用事务的自动提交模式
注意:
- 当执行 DML 语句是其实就是开启一个事务 ,事务只对 DML 有效果。
- 事务的回滚只能回滚 insert、delete 和 update 语句,不能回滚 select(回滚 select 没有任何意义),对于 create、drop、alter 这些无法回滚。
- rollback,或者 commit 后事务就结束了。
四、事务的隔离级别
1. 四个隔离级别
事务的隔离级别决定了事务之间可见的级别。 InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务:
(1)读未提交(READ UMCOMMITTED)
允许一个事务可以看到其他事务未提交的修改。
(2)读已提交(READ COMMITTED)
允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。
(3)可重复读(REPEATABLE READ)
确保如果在一个事务中执行两次相同的 SELECT 语句,都能得到相同的结果,不管其他事务是否提交这些修改。(银行总账) 该隔离级别为 InnoDB 的缺省设置。
(4)串行化(SERIALIZABLE) 【序列化】
将一个事务与其他事务完全地隔离。
2. 并发事务导致的问题
当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:
(1)脏读取(Dirty Read)
一个事务处理过程中读取了另一个未提交的事务中的数据,这就出现了脏读取。
例如:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
(2)不可重复读(Non-repeatable Read)
在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。
例如:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
(3)幻像读(Phantom Read)
幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。 幻读是事务非独立执行时发生的一种现象。
例如:系统管理员 A 将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员 B 就在这个时候插入了一条具体分数的记录,当系统管理员 A 改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
注意:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
3. 隔离级别与一致性问题的关系
隔离级别 | 脏读取 | 不可重复读 | 幻想读 |
---|---|---|---|
读未提交 | 可能 | 可能 | 可能 |
读已提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 对InnoDB不可能 |
串行化 | 不可能 | 不可能 | 不可能 |