2.1 KiB
2.1 KiB
- 数据库操作的最小单元
- 作为一个整体一起向系统提交
- 事务是一组不可拆分的操作集合
- ACID
- 原子性
- 要么都执行,要么都不执行
- 一致性
- 事务执行前后是从一个一致性状态到另一个一致性状态
- 隔离性
- 事务之间互不干扰
- 持久性
- 事务一旦完成修改永久保存
- 原子性
- 并发事务的问题
- 脏读
- 读取到了另一个事务未提交的数据
- 丢失修改
- 一个事务修改了这个数据,但是另一个事务也修改了这个数据,这个时候第一个事务的修改结果就丢失了
- 不可重复读
- 一个事务多次读取同一个数据,读取到的结果不一样
- 幻读
- 一个事务多次查询返回的结果总数不一样
- 脏读
- 避免事务的并发问题
- 配置事务隔离级别
- 读未提交
- 读已提交
- 可重复读
- 串行化
- 默认情况下使用默认的隔离级别,一致性要求高就使用较高的事务隔离级别
- 靠缓存可以提升事务隔离级别的性能
- 有缓存只能提供高效读,不能保证数据即时一致性,还需要额外开销管理缓存
- 隔离实现方案
- 读写锁
- 锁定读,共享读锁之间不会排斥,写锁会排斥其他锁
- 锁竞争时,要等待其中一个操作释放锁另一个才能获取锁
- 行锁
- 间隙锁
- select lock in share mode
- select lock for update
- insert、update、delete
- MVCC
- 一致性非锁定读
- 隐藏字段
- DB_TRX_ID,标记最近一次对本行记录做修改的事务id
- DB_ROLL_PTR,回滚指针,指向改行的undolog
- DB_ROW_ID,没有主键和唯一列时会使用该id生成聚簇索引
- Read View
- 记录和隔离不同事物并发时此纪录哪些版本对当前事务可见
- Undolog
- 回滚数据,读取可见版本的数据
- 读写锁
- 一致性、原子性如何实现
- 通过MVCC实现
- 灾备通过redolog实现,redolog会记录下来所有修改,崩溃后可以通过redolog恢复修改
- 持久性如何实现
- redolog实现,事务提交的时候先将所有日志写入日志文件进行持久化,即WAL(write ahead log)机制