什么是事务
事务是一系列操作的集合,要么全做,要不不做,保证数据库处于一致性的状态。
事务使数据库系统更好的进行故障恢复和并发控制,使数据库处于一致性状态。
事务有什么特性
- 原子性:事务内的操作要不全做,要么不做
- 一致性:事务前后数据处于一个客观合理的状态
- 隔离性:在并发状态下事务间不相互影响
- 持久性:事务的操作不会由于故障等原因丢失
为了保证事务的特性,数据库并发控制和日志恢复是关键
事务并发异常
- 脏写
- 更新丢失
- 脏读
- 不可重复读
- 幻读
事务的隔离级别
mysql默认隔离级别是可重复读
事务隔离的实现机制
- 基于锁的并发控制
共享锁:数据库对事务A加共享锁,对其它事务只能加共享锁,不能加排他锁;
排他锁:数据库对事务A加排他锁,对其它事务不能加任何锁;
- 基于快照隔离的并发控制
多版本并发控制(mvcc),给每一行数据增加两个隐藏字段,创建时间和过期时间(时间而非时间戳,指事务版本号),
- 其它
Mvcc具体实现
- 快照读:读快照版本,指历史版本
普通的select为快照度
- 当前读:读最新版本
UPDATE、DELETE、INSERT、SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE是当前读
- 锁定度
- 一致性非锁定读
锁
- 悲观锁
- 乐观锁
- 行锁
- 间隙锁
- next-key lock
- 利用MVCC实现一致性非锁定读,这就有保证在同一个事务中多次读取相同的数据返回的结果是一样的,解决了不可重复读的问题
- 利用Gap Locks和Next-Key可以阻止其它事务在锁定区间内插入数据,因此解决了幻读问题
参考
- 数据库事务的概念及其实现原理 - takumiCX - 博客园
- MySQL事务隔离级别的实现原理 - 废物大师兄 - 博客园



