- 事务概念
- 什么是事务:事务是指单个逻辑单元的一系列业务操作,要嘛全部成功,要嘛全部失败
- 本地事务(区别于分布式事务)
- 概念:本地事务是指开启事务/执行sql语句/提交事务或事务回滚
- 特征:
- 一次事务只连接一个支持事务的数据库(一般来说都是关系型数据库)
- 事务的执行结果保证ACID
- 会用到数据库锁
- ACID概念与实现方式:
- Atomicity 原子性-undo log(回滚日志实现)
- Consistency 一致性-基于其他三个
- Durability 持久性-Redo log
- Isolation 隔离性-锁&MVCC
- 要求两个事务顺序执行,一个事务未完成,中间状态是不可见的
- undo log与redo log
- undo log
- redo log
- sql的隔离级别
- 读未提交
- 读提交
- 可重复读:通过间隙锁解决了幻读问题
- 串行化:效果最好,但是将事务执行变为哦顺序化,相当于单线程
sql事务隔离级别要实际解决的问题
- 脏读:读到了其他事务未提交的数据(未提交意味着可能回滚,即最终不一定存在的数据)
- 幻读: 两次读取读到了不同的数据条数(其他事务提交了INSERT)
- 不可重复读:在一个事务内,多次读取的值不一致(其他事务提交了UPDATE)
- 丢失更新 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | | —- | —- | —- | —- | | 读未提交(Read uncommitted) | 可能 | 可能 | 可能 | | 读提交(Read committed) | 不可能 | 可能 | 可能 | | 可重复读(Repeatable reads) | 不可能 | 不可能 | 可能 | | 串行化(Serializable) | 不可能 | 不可能 | 不可能 |
MVCC机制
- 简单理解,就是一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。 如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本
- 增强了并发性
- Mysql只有InnoDB支持
- 分布式事务
- 概念:在分布式环境下,一个请求可能涉及到多个数据库的写操作,需要保证多数据源的一致性必须用到分布式事务
- 常见分布式事务解决方案
- 2pc:整个事务分为两个阶段-准备阶段(P)与提交阶段(C)