事务并发调度的可串行性及两段锁协议 妖狐艹你老母 2023-02-22 10:59 2阅读 0赞 ## 一、并发调度 ## -------------------- 并发调度啥意思? 就是当很多事务同时执行的时候应该按照什么顺序执行,应该按照排队的顺序执行,这就是 **串行调度** 。 串行执行肯定是正确的,但是改变一下位置有影响吗? 这就要看改变顺序之后执行的结果是否和不改变顺序执行的结果一致了。 如果改变顺序之后执行的结果和串行调度的执行结果一致,那么就说这种调度是 **可串行化调度**。 > 可串行性是并发事务正确调度的准则。 比如: 事务 T1: 读 B A=B+1;写回 A; 事务 T2: 读 A B=A+1;写回 B; 假设 A、B 的初始值都是 2,串行调度指的就是先执行 T1 再执行 T2,或者先执行 T2 再执行 T1,这是没有区别的,都是正确的。 1、先执行 T1:结果是 A=3,B=4; 2、先执行 T2:结果是 B=3,A=4; 其实这里执行的顺序可以是(`R`代表读,`W`代表写),这两个都是 **串行调度** : 1、R1(B) W1(A) R2(A) W2(B) 2、R2(A) W2(B) R1(B) W1(A) **我们只需要保证对同一数据对象的 `读写(写读)操作`和 `写写操作` 的相对位置不变即可。** 涉及对同一数据对象的读写操作称为 **冲突操作** 。 解释一下前面的意思,这里的同一数据对象假设是 A ,`W1(A) R2(A)` 就是对`同一数据对象`的读写操作,那么他们的顺序是不能调换的,不然数据的结果就会改变。这里的顺序是先 写`A` 再读 `A` ,相对位置指的是他们中间可以有其他的操作。 比如,在上一个例子中,如果执行的顺序改成下面的样子: R1(B) R2(A) W1(A) W2(B) 这就不对了,因为改变了关于数据对象 `A` 的读写顺序,应该是先写再读,因为这两个是冲突操作,所以不能随便调换位置,现在调换了无论如何也不能通过 `交换不冲突操作的位置` 变成那两个串行调度中的任何一个了。 > 总之:不管是同一个事务还是多个事务操作,只要是涉及对同一数据对象的 `读写操作` 或 `写写操作` 调换顺序的时候就要谨慎一点,不要改变了原来的结果。 除了冲突操作之外的操作称为不冲突操作,如果一个调度通过 **交换不冲突操作** 的次序得到的另一个调度是串行的,那么称这个调度为 **冲突可串行化** 的调度。 > 冲突可串行化调度只是可串行化调度的一种。有的时候就算改变了位置结果也不变。 ## 二、两段锁协议 ## -------------------- 两段锁协议是为了保证事务并发调度的正确性,简称 `2PL` 协议。 * 第一阶段是获得锁:`扩展阶段`:只允许加锁; * 第二阶段是释放封锁:`收缩阶段`:只允许解锁; 如果并发执行的所有事务都遵循两段锁协议,那么对这些事务的任何并发调度都是可串行化的。 可能大家回想到预防死锁时使用的 **一次封锁法** 。他们的区别在于两段锁协议只是说加锁的时候在一个阶段完成,没说要用的所有数据都必须加锁,而后者则要求所有使用到的数据必须加锁而且是在刚开始的加锁时期;所以只要是使用一次封锁法的协议都遵循两段锁协议,同时也说明两段锁协议也有死锁问题。 关于死锁这里提一嘴,有两种方法解决: * 一是预防:一次封锁法、顺序封锁法; * 二是解决:超时法、等待图法。 其中等待图法指的是有一个 `有向图` ,每个 `节点` 表示正在执行的事务,每个 `边` 表示事务等待的情况,如果图中存在环路则说明出现了死锁。一般是选择一个处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务继续运行下去。 另外对于封锁对象的大小不同,比如封锁一个元组,一张表或者整个数据库,分为不同的封锁粒度;这个时候就要分粒度封锁,在分粒度封锁的基础之上又发明了一种方法叫做`意向锁`。 那么这个意向锁又是个什么东西呢? 意向锁建立在一个`多粒度树`上面,多粒度树就是将整个数据库按照对象的大小建立一棵树; ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70][] 这个时候你在一个节点上面加上一个意向锁,那么它以及他的子节点默认被加锁; > 具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70]: https://img-blog.csdnimg.cn/20200703160138979.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA==,size_16,color_FFFFFF,t_70
相关 Java并发编程中的锁机制:公平锁、可中断锁等的理解及陷阱 在Java的并发编程中,锁机制是控制多个线程对共享资源访问的一种机制。以下主要介绍几种常见的锁机制: 1. 公平锁(Fair Lock): - 在多线程环境下,如果一个 墨蓝/ 2024年09月11日 12:12/ 0 赞/ 28 阅读
相关 串行、并行和并发的区别 1. 串行是在时间上不允许重叠,前一个任务没有执行完,后面的任务只能等待 1. 并行是时间上重叠的,两个任务在同一时刻互不干扰的同时执行 1. 并发允许两个任务彼此干 待我称王封你为后i/ 2024年03月27日 09:07/ 0 赞/ 87 阅读
相关 串行、并行、并发 串行 一个任务执行完在执行下一个任务。 比如先吃饭,吃完了去打游戏。 串行就是简单地one by one的思路。 ![893563e41edd8f42 清疚/ 2023年09月27日 16:08/ 0 赞/ 99 阅读
相关 事务并发调度的可串行性及两段锁协议 一、并发调度 -------------------- 并发调度啥意思? 就是当很多事务同时执行的时候应该按照什么顺序执行,应该按照排队的顺序执行,这就是 串行调度 妖狐艹你老母/ 2023年02月22日 10:59/ 0 赞/ 3 阅读
相关 使用封锁协议解决事务的并发问题 一、事务的并发问题 -------------------- > 事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 并发是 川长思鸟来/ 2023年02月22日 10:55/ 0 赞/ 141 阅读
相关 mysql并发 锁机制_Mysql事务,并发问题,锁机制 1、什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正 小灰灰/ 2023年01月11日 14:26/ 0 赞/ 185 阅读
相关 【MySQL】事务与锁(一):详解数据库事务及并发时可能出现的问题 在项目里面,什么地方会开启事务,或者配置了事务?无论是在方法上加注解,还是配置切面。 <tx:adviceid="txAdvice"transaction-manag 心已赠人/ 2022年11月21日 11:22/ 0 赞/ 209 阅读
相关 两段锁协议 我们都知道,事务调度一般有串行调度和并行调度,那首先来了解几个概念。 并发控制:所谓并发控制,是指多用户共享的系统中,许多用户可能同时对同一数据进行操作。 调度:指的是事务 偏执的太偏执、/ 2022年06月12日 03:36/ 0 赞/ 159 阅读
相关 【MySQL】事务,隔离级别,锁,并发性 MySQL事务,隔离级别,锁,并发性 数据库语言类型 事务 并发一致性问题 封锁 封锁粒度 封锁类型 封锁 浅浅的花香味﹌/ 2022年05月09日 11:10/ 0 赞/ 279 阅读
还没有评论,来说两句吧...