文章目录
前言
目的:事务将数据库从一种一致性状态转换为另一种一致性状态;
特征:在数据库提交事务,可以确保要么所有修改已经保存,要么所有修改都不保存;
一、事务控制语句
START TRANSACTION | BEGIN --显示开启事务
COMMIT--提交事务,并使得已对数据库做的所有修改持久化
ROLLBACK--回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
SAVEPOINT identifier --创建保存点
RELEASE SAVEPOINT identifier --保存保存点
ROLLBACK TO [SAVEPOINT] indentifier --回滚至保存点
二、ACID特性
1.原子性(Atomicity)
要么都提交,要么都回滚。
实现:undolog 实现回滚操作
2.一致性(Consistency)
指数据库从一种一致性状态转变为下一种一致性状态,执行事务前后,数据库完整性没有被破坏。
3.隔离性(Isolation)
事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离,也就是事务提交前对其它事务都不可见。
实现:mvcc,表(索引B+树)锁,页(索引B+树叶子节点)锁,行(叶子节点当中某一段记录行)锁
4.持久性(Durability)
事务提交后,事务DML操作将会持久化(写入redolog磁盘文件);即使发送宕机等故障,数据库也能将数据恢复。redolog记录的是物理日志。
二、事务并发异常
1.脏读
现象:事务1可以读到事务2未提交的数据;
解决:隔离级别提升到read-committed。
2.不可重复读
现象:事务1可以读到事务2的提交数据。通常发生在一个事务种两次读到的数据是不一样的;
解决:隔离级别提升到repeatable-read
3.幻读
现象:事务中一次读操作不能支撑接下来的业务逻辑;通常发生在一个事务中一次读判断接下来写操作失败的情况。
解决:1.加读锁,select 语句后加 LOCK IN SHARE MODE;
2.隔离级别提升到serializable
4.小结
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ-UNCOMMITTED | 存在 | 存在 | 存在 |
READ-COMMITTED | 不存在 | 存在 | 存在 |
REPEATABLE-READ | 不存在 | 不存在 | 存在 |
SERIALIZABLE | 不存在 | 不存在 | 不存在 |
三、其他细节
1.锁
锁类型 | 概念 | |
---|---|---|
共享锁(S) | 行级 | 读时使用 |
排他锁(X) | 行级 | 更改或删除时使用 |
意向共享锁(IS) | 表级 | 对表中几行使用的共享锁 |
意向排他锁(IX) | 表级 | 对表中几行使用的排他锁 |
2.MVCC
概念:多版本并发控制;用来实现一致性的非锁定读(读时不加X锁)。
3.redo log
用来实现事务的持久性;内存中包含redo log buffer,磁盘中包含redo log file。
3.undo log
用来帮助事务回复,以及MVCC的功能;存储在共享表空间中;undo是逻辑日志,回滚时将数据库逻辑地恢复到原来的样子。同时记录行的版本信息,用于处理MVCC功能;