一、什么是事务
事务由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元,这些操作要么全部执行, 要么全部失败。
作用:保证一组操作在进行过程中要么同时成功,要么同时失败。
目的:保持多并发情况下数据一致;如果出现错误的操作可以进行改正。
1、事务的特性(ACID)
原子性
(Atomicity)
事务中不可分割的一个单元,事务中的全部操作要么全部成功,要么全部失败。
解释:如果事务完成,那就是成功;如果事务中出错,那就回滚,当作这个事务没执行过,即失败。一致性
(Consistency)
事务完成前后,数据的完整性没有被破坏,必须保持一致。
解释:顾名思义,一致即一致,不是说数据一模一样,是定制的规则一致,是数据的状态一致。打个比方:转账前A有500,B有400。A给B转100,事务完成后,A有400,B有500。这个结果是正确的,一个减一个加,符合我们给的数学计算的规则。哪怕A转出去钱,转成负数,只要他们两的钱相加为900
,就符合一致性,因为给的数学计算规则可以为负数。隔离性
(Isolation)
一个事务的执行不受其他事务的影响,也就是一个事务的内部操作和使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能相互影响,要互相隔离。
解释:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。持久性
(Durability)
也称为永久性,指一个事务一旦提交,对数据库中数据的修改是永久性的
,即使数据库甚至系统故障也不会丢失。
2、事务的隔离级别
2.1 为什么要有事务的隔离?
数据库中的数据有可能同时被多个用户访问,当多个用户操作相同数据的时候,如果不考虑隔离性,事务存在三种并发访问问题
。
- 脏读:
指一个事务读取了另一个事务未提交的数据。
线程A - 小明的余额 1000
线程B - 读取小明的余额1000,取钱 1000 - 900 = 100,此时事务还没有提交
线程A - 又查询小明的余额,此时发现余额为100,说明线程A读取了线程B没有提交的数据 - 不可重复读
一个事务中对同一个数据进行两次读取,结果不一致;一个事务读到了另一个事务修改后的数据.
一个事务读到了另一个事务已经提交(update)的数据。引发另一个事务,在事务中的多次查询结果不一致。 - 幻读(虚读)
一个事务中执行两次查询,在第二次查询中出现了第一次查询的时候不包含的数据; 一个事务读到了insert的数据。
一个事务读到了另一个事务已经提交(insert)的数据。导致另一个事务,在事务中多次查询的结果不一致。
事务的术语
- 什么是事务的隔离级别?
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
读已提交(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
串行化(Serializable) | 不可能 | 不可能 | 不可能 |