什么是事务
保证一连串的读写操作的原子性,要么全部成交,要么全部回退。
它解决了什么
不同的事务机制解决不同的问题
-
脏读(读已提交)
读到未提交的数据
-
不可重复读(可重复读)
数据被update前后,导致两次查询不一样
-
幻读(可串行化)
数据被delete/add前后,导致两次查询不一样
它的特性
ACID
- A:原子性
- C:一致性
- I:隔离性
- D:持久化
事务模型
-
平板事务
所有的操作,要么全部成功,要么全部失败
-
带保存点的平板事务
在整个事务的周期内,可以设置不同的保存点,可以前面的保存点成交,后面的回滚掉
-
链式事务
事务提交后,环境可以保存,并给下一个事务继续使用
-
嵌套事务
整个事务是一课树,子树可以局部成交,只有根节点成交,整个事务才算成交
-
分布式事务
在分布式环境的事务
-
多层次事务
整个事务是一棵树,每颗节点的事务类型可以不一样,子树可以局部成交,只有根节点成交,整个事务才算成交
并发控制
并发技术是在保证事务实现的正确性,为了提高并发的性能,牺牲一部分的一致性。在性能与正确之前取一个平衡值
并发控制类型
乐观并发控制
开始时,任何操作都被允许;只有在事务提交的时候,进行有效性检验,如果通过,则事务提交,否则回滚。
乐观控制适合冲突少的场景
基于有效性确认的并发控制是乐观控制
悲观并发控制
在执行每个操作的时候,都进行有效性检验,如果检验不过,则回滚或者阻塞
悲观控制适合冲突多的场景
基于两阶段锁和基于时间戳排序的并发控制技术都属于悲观技术
并发控制实现技术
时间戳排序并发控制技术
- 每个事务在开始时赋予一个时间戳
- 进行read的时候,判断此记录是否被一个更后的时间戳写过,如果写过,则回滚(read - write check)
- 进行write的时候,判断此记录是否被一个更后的时间戳写过,如果写过,则回滚(write - write check)
- 提交事务
基于有效性确认的并发控制技术
- 每个事务在开始时赋予一个序号
- 进行read/write时直接通过
- 在commit的时候判断是否符合冲突可串行化,如果符合,则提交,否则回滚
两阶段锁并发控制技术
- 在事务提交之前的read和write分别对数据项进行加读写锁
- 如果有其他事务对数据项进行读写,则要判断锁是否允许进行读写,如果不行,则阻塞
- 事务提交阶段,进行锁释放
多版本并发控制技术
解决两阶段锁的性能低下的问题。
它主要提升了read - write的性能。通过对数据项引入多版本。
- 在事务中,对数据项进行write的时候,不上锁,而是对数据项写入一个新版本
- read的时候,读取版本低于自己的数据项
- write的时候,如果发现数据项已经被write了,而且没有提交,则阻塞
- 最后提交事务,对数据项多版本进行清理
基于索引的并发控制技术
在索引上进行上锁,来控制并发
可以通过在索引上施加next-key locking来解决幻读问题
日志技术
REDO日志
为了提高数据写入磁盘的效率,数据在提交时,并不马上写入磁盘,如果数据库重启或者奔溃。可以通过REDO日志恢复数据
REDO log通过重新执行数据,可以把已提交的数据写入磁盘
UNDO日志
对于未提交的事务或者回滚的事务,UNDO log通过混滚相应的数据操作,对数据进行恢复
网友评论