确保数据一致性 – 事务与并发控制

事务

一次性完成多个数据库操作的业务构成一个基本单元,即为事务。为保证操作正确和数据的正确性,需满足事务四特性

事务的四种特性

A,原子性,事务中的操作要么全部执行,要么全不执行

C,一致性,事务中的操作执行前后数据库都是一致状态

I,隔离性,事务内部的操作和数据不受其他事务影响

D,持久性,事务提交对数据的修改会永久存入数据库

常见的并发不一致

事务内的操作是按序执行的,不同事务间的操作是并发执行的,如不加控制,并发序列可能会导致以下四个问题

丢失修改,事务读取另一个事务写操作之前的数据,而在写该数据时覆盖了另一个事务的写操作

重复读错误,事务在另一个事务的写操作前后读出的数据不一致

脏读,事务读取了另一个事务撤回前的数据

幻读,事务读取了另一个事务插入后的数据

并发调度的正确性

可串行化调度 并发序列的调度结果 和 串行执行事务结果 一致

冲突可串行化调度 交换非冲突操作得到的可串行化调度

冲突操作 即同一事务的任何两操作,不同事务对同一数据的两个读写、两个写写操作

可冲突 -> 可串行,可串行 -> 正确,反之不然

冲突可串行化调度的判别算法 对于每个数据元素,不同事务之间的冲突操作可以确定事务的执行先后顺序,若先后顺序出现矛盾则为非冲突可串行化调度,表现为事务调度时序图中出现环

两种并发控制

(待续)并发控制的目的为了保证一系列单独执行时操作成功,同一事务中的数据未作修改不能变动

基于封锁的并发控制

常见的几种锁及相容性

写锁X 即排他锁,事务持有数据的写锁,其他事务不可对此数据加任何锁

更新锁U 事务持有数据的更新锁,其他事务不可对此数据加任何锁

读锁S 即共享锁,事务持有数据的读锁,其他事务可对此数据加读锁、更新锁

多级封锁协议和两阶段封锁协议,加锁时机

一级封锁协议 开始写操作时加X锁直至事务提交时解锁

二级封锁协议 开始写操作时加X锁直至事务提交时解锁,开始读操作加S锁不使用该数据时解锁

三级封锁协议 开始写操作时加X锁直至事务提交时解锁,开始读操作时加S锁直至事务提交时解锁

(待续)两段锁协议如何保证数据一致性

基于撤回的并发控制

基于时间戳的并发控制

方法 通过比较每个操作完成时的时间戳,保证先执行的事务先执行读写操作,否则有冲突撤回事务

基于有效性确认的并发控制

方法 通过有效性确认判断出 读写冲突 和 写写冲突 导致的数据不一致而撤回,若有效性确认均正确,则并发的读写调度序列是正确的

一个事务从开始到自身的有效性确认之前读数据,有效性确认之后到事务完成写数据

读写冲突 对于同一个数据,一个事务读取了另一个事务写成功之前的数据

写写冲突 对于同一个数据,后执行的事务在先执行的事务写成功之前写

通过两个事务读写操作集合的交集来判别是否冲突

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

©2018-2024 Howell版权所有 备案号:冀ICP备19000576号