ACID
- 原子性(A):一个事务的操作,要么全部完成,要么全部不完成
- 数据库管理系统(DBMS),默认情况下一条sql一个单独事务,事务自动提交。
- 显示使用start transaction开启事务,将sql放在事务中执行
- 预写事务日志,将数据提交到实际数据页面前,先写在事务日志上
- 一致性©:数据在事务期间多个操作中,数据不会凭空消失或增加,数据的每一个增删改查都有因果关系,例如A转200给B,不会出现A扣费了,B没收到情况
- 事务执行之前和之后,数据符合自己设置的CHECK约束和触发器设置
- 隔离性(I):防止多个事务并发交叉执行导致数据不一致
- 通过锁来实现的,通过阻塞来阻止
- 持久性(D):事务结束后对数据的修改是永久的,即便系统故障也不会丢失
- 事务在提交前,先写入事务日志中,数据库故障时重启MySQL,首先检查日志顺序号,将本应对数据库的更改而未做的部分持久化到数据库。
事务操作可能出现的数据问题
- 脏读:事务A读取事务B更新的数据,B进行回滚,A读到脏数据
- 不可重复度:事务A多次读取同一数据,B在A多次读取过程中,对数据更新并提交,导致A多次读取同一数据时,结果不一致
- 幻读:系统管理员A对数据库所有学生成绩从具体分数改为ABCDE等级,但管理员B插入一条具体分数记录,当A改结束后未提交发现还有一条记录没有改过来即产生幻读现象
事务操作可能出现的更新丢失问题
- 第一类更新丢失:事务A回滚覆盖了事务B已提交的结果
- 第二类更新丢失:事务A提交覆盖了事务B提交的结果
隔离性级别
- 读未提交:事务可读取其他事务修改后还未提交的数据
- 读提交:事务不可读取其他事务修改后还未提交的数据
- 可重复度:事务执行期间不能读取其他事务还未提交的数据,也不能读取其他事务更新提交后的数据
- 可串行化:强制事务串行执行
事务隔离界别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 是 | 是 | 是 |
读提交 | 否 | 是 | 是 |
可重复度 | 否 | 否 | 是(×) |
串行化 | 否 | 否 | 否 |
- 级别隔离强度:读未提交<读提交<可重复读<串行
注意: MySQL中RR级别不会产生幻读现象,事务A更新所有记录中某个字段,事务A获得表锁,事务B插入数据时无法获取锁阻塞,只有事务A提交释放锁后事务B才可进行接下来操作