事务
一次性完成多个数据库操作的业务构成一个基本单元,即为事务。为保证操作正确和数据的正确性,需满足事务四特性
事务的四种特性
A,原子性,事务中的操作要么全部执行,要么全不执行
C,一致性,事务中的操作执行前后数据库都是一致状态
I,隔离性,事务内部的操作和数据不受其他事务影响
D,持久性,事务提交对数据的修改会永久存入数据库
常见的并发不一致
事务内的操作是按序执行的,不同事务间的操作是并发执行的,如不加控制,并发序列可能会导致以下四个问题
丢失修改,事务读取另一个事务写操作之前的数据,而在写该数据时覆盖了另一个事务的写操作
重复读错误,事务在另一个事务的写操作前后读出的数据不一致
脏读,事务读取了另一个事务撤回前的数据
幻读,事务读取了另一个事务插入后的数据
并发调度的正确性
可串行化调度 并发序列的调度结果 和 串行执行事务结果 一致
冲突可串行化调度 交换非冲突操作得到的可串行化调度
冲突操作 即同一事务的任何两操作,不同事务对同一数据的两个读写、两个写写操作
可冲突 -> 可串行,可串行 -> 正确,反之不然
冲突可串行化调度的判别算法 对于每个数据元素,不同事务之间的冲突操作可以确定事务的执行先后顺序,若先后顺序出现矛盾则为非冲突可串行化调度,表现为事务调度时序图中出现环
两种并发控制
(待续)并发控制的目的为了保证一系列单独执行时操作成功,同一事务中的数据未作修改不能变动
基于封锁的并发控制
常见的几种锁及相容性
写锁X 即排他锁,事务持有数据的写锁,其他事务不可对此数据加任何锁
更新锁U 事务持有数据的更新锁,其他事务不可对此数据加任何锁
读锁S 即共享锁,事务持有数据的读锁,其他事务可对此数据加读锁、更新锁
多级封锁协议和两阶段封锁协议,加锁时机
一级封锁协议 开始写操作时加X锁直至事务提交时解锁
二级封锁协议 开始写操作时加X锁直至事务提交时解锁,开始读操作加S锁不使用该数据时解锁
三级封锁协议 开始写操作时加X锁直至事务提交时解锁,开始读操作时加S锁直至事务提交时解锁
(待续)两段锁协议如何保证数据一致性
基于撤回的并发控制
基于时间戳的并发控制
方法 通过比较每个操作完成时的时间戳,保证先执行的事务先执行读写操作,否则有冲突撤回事务
基于有效性确认的并发控制
方法 通过有效性确认判断出 读写冲突 和 写写冲突 导致的数据不一致而撤回,若有效性确认均正确,则并发的读写调度序列是正确的
一个事务从开始到自身的有效性确认之前读数据,有效性确认之后到事务完成写数据
读写冲突 对于同一个数据,一个事务读取了另一个事务写成功之前的数据
写写冲突 对于同一个数据,后执行的事务在先执行的事务写成功之前写
通过两个事务读写操作集合的交集来判别是否冲突