Files
Hui-s-notebook/logseq-java/pages/MySQL事务.md
2024-02-02 00:12:49 +08:00

54 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
- 数据库操作的最小单元
- 作为一个整体一起向系统提交
- 事务是一组不可拆分的操作集合
- 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实现事务提交的时候先将所有日志写入日志文件进行持久化即WALwrite ahead log机制