-
事务
-
事务指的是数据库的状态发生变更的一组操作序列,也是数据库状态变化的基本单元
-
事务的特性:ACID
A: Atomicity,原子性:事务的执行要么全部成功要么全部失败,不存在中间状态
C:Consistency, 一致性:数据库的状态符合业务的预期状态。
I:Isolation,隔离性:并发执行的事务不会相互影响。
D:Durability,持久性:指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的,系统崩溃后也能恢复
-
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面
-
1、事务的并发执行 ----> 事务的隔离性 --how--> 并发控制理论
-
2、事务故障或系统故障 ------> 事务的原子性和持久性 -----how--> crash recovery 机制
-
-
-
-
事务为什么要并发(交错)执行,并发控制理论解决的是什么问题?
-
为什么要并发执行? Slow disk/network I/O & Multi-core CPUs ---> 一个事务因某些资源而停止(i.e. page fault)可以让第二个事务执行,使其充分利用资源
-
但是并发执行很容易造成竞争条件(race condition:输出的结果取决于不受控制事件的出现顺序),为了保证并发执行的事务满足一致性,也就是如何在正确的前提下并发执行事务 -----> 并发控制理论
-
并发控制理论中定义的并发执行正确性:让事务的执行调度等价于某些串行化执行事务的调度 ----> 该事务调度就被称为可串行化的调度(Serializable Schedule : A schedule that is equivalent to some serial execution of the transactions)
-
-
并发控制理论(concurrency control theory)
-
并发控制理论是为了实现事务的隔离性,使事务的调度是冲突可串行化的,并发控制理论的实现主要有两种思想:悲观思想和乐观思想
-
悲观思想指的是并发的事务肯定会产生冲突,从一开始就不能让问题产生;乐观思想指的是,并发事务的冲突很少产生,等执行后再来处理。
-
悲观思想的实现方式有两阶段锁,两阶段锁中的两阶段分别是growing阶段和shrinking阶段,growing阶段指的是事务向锁管理器请求它需要的锁过程中不能释放锁,shrinking阶段指的是一但事务释放锁,他就不能再获得锁。
-
这种锁协议的优点在于实现了事务的调度是可串行化的调度,缺点是1、容易导致读写阻塞,并发性能差2、阻塞后线程切换的上下文开销大3、遇上脏读会造成级联中止,脏读指的是一个事务读到了另一个撤销事务所修改的数据,级联中止指的是一个事务中止会导致脏读的事务也中止,解决此问题的方法为执行严格两阶段锁,与两阶段锁的区别在于在事务结束的时候再释放锁。
-
(只要有锁就会产生死锁(deadlocks) 问题)这两种锁的方案可能会造成死锁,解决死锁的方式有两种,第一种是死锁检测,第二种是死锁预防
-
死锁其实就是事务彼此间依赖成环,死锁检测指的是维护一个wait-for图去跟踪每个事务需要等待获取的锁,其中wait-for图的节点代表的是一个事务,向量边从T_i指向T_j代表的是T_i事务正在等待T_j释放它想要获得的锁。如果wait-for是一个循环图,则代表检测出死锁,这时需要选择一个受害者事务来重启或中止来打破死锁,受害者事务的选择有多种策略,可以是事务的执行时间,事务所包含的元素个数等。
-
死锁预防指的是当一个事务尝试获得另一个事务所持有的锁时,the DBMS杀死他们中的一个来预防死锁,如何选择杀死哪个事务有两种选择策略,分别是wait-die和wound-die,他们的相同点在于把事务分配的时间戳代表事务的优先级,不同点在于一个wait-die指的是一个获取锁的事务的优先级高于持有锁的事务,则获取锁的事务等待释放锁,如果优先级低于持有锁的事务,则中止获取锁的事务;wound-wait指的是一个获取锁的事务的优先级高于持有锁的事务,则中止持有锁的事务,使其释放锁,如果优先级低于持有锁的事务,则获取锁的事务等待释放锁。
-
-
- 乐观思想的实现方式有基于时间戳顺序的并发控制,这是一种没有锁的并发控制协议,它通过事务的时间戳来决定事务的串行化顺序。
- basic T/O 协议大致原理是给每个对象维护一个写时间戳W-TS(X)和读时间戳R-TS(X),对于读操作,比较事务的时间戳和对象的写时间戳,如果事务的时间戳小于对象的写时间戳,代表违反了时间戳顺序,中止或重启事务,如果大于,则读对象,同时如果事务的时间戳大于对象的读时间戳,则更新对象的读时间戳为事务的时间戳,对于写操作,如果事务的时间戳小于对象的读时间戳或者写时间戳,则重启或中止事务,否则就可以写操作,并更新对象的写时间戳。一个优化方法 当一个写操作的事务的时间戳低于对象的写时间戳时可以忽略掉写操作,不中止事务(违背了时间戳顺序)。
- T/O协议的**优点**可以避免死锁的产生(破环了死锁的请求和等待条件),但是可能导致事务饿死(长执行时间事务被不断回滚,事务重新执行会更新时间戳的),同时T/O协议规定事务的调度是不可恢复的,可恢复的指的是一个事务失败了,应该能撤销该事务对数据库的影响(脏读)。
- 2PL 和 T/O 在某种程度来说**都是悲观**的,对某个tuple进行读写,2PL 需要获得锁, T/O 需要确保事件戳顺序正确, 也就是在进行操作的时候要进行冲突检测,这两种方案都假设了系统存在大量的冲突情况,并试着阻止错误的发生
- 如果一个场景:事务间冲突小,大多数事务生命周期短, 如何选择并发控制协议? -----> 优化basic T/O -----> 乐观并发控制协议(OPTIMISTIC CONCURRENCY CONTROL)
- 乐观并发控制协议(OCC),其大致思想是将事务所涉及到的对象都产生一个副本,事务在副本上进行运行,当它提交时,再比较是否与其他事务冲突,没有则写进本体,否则中止或重启事务。OCC分为三个阶段读阶段、验证阶段、写阶段。**读阶段**将事务所涉及到的元素拷贝到一个私有空间,对其他事务不可见;**验证阶段**,当事务请求commit时,进入验证阶段,在这个阶段分配时间戳,检测是否冲突,验证方式分为两种,一种是向前验证,即与未提交的事务验证是否冲突,另一种是向后验证,与已提交的事务进行验证是否冲突
- OCC适合事务的冲突数量比较低时候,比如大量的只读事务、事务访问的交集对象很少。OCC的缺点也很明显,1、产生副本的空间开销大,2、验证和写阶段比较麻烦,会成为性能瓶颈(加锁),3、中止事务的成本高(事务运行完后再做比较)。
-
事务相关知识点总结(并发控制理论)
最新推荐文章于 2024-06-24 23:38:25 发布
事务是数据库状态变化的基本单元,具有ACID特性。并发执行事务可以提高效率,但也可能引发一致性问题。并发控制理论包括悲观锁和乐观锁策略,如两阶段锁和时间戳顺序控制,以确保事务的隔离性和可串行化。乐观并发控制协议(OCC)适用于冲突较少的场景,通过事务副本和验证阶段避免冲突。
摘要由CSDN通过智能技术生成