第六篇:并发-粒度锁
目录
并发事务 – 冲突和性能问题
锁的粒度
实践中的实际粒度锁
隔离概念...树锁定和意图锁定模式
乐观锁
时间戳
并发事务 – 冲突和性能问题
多个并发运行的事务可能会导致冲突
- 我们仍然尽量允许并发运行以获得更好的性能,同时尽可能避免冲突
一个新的解决方案:
使用粒度锁——我们需要建立一些层次结构,然后可以在任何级别上获取锁,这将自动授予其后代锁。
锁的粒度
主意:
选择一组列值(谓词)。
它们形成图/树结构。
锁定此图/树中的节点
它允许锁定整个数据库、整个文件或仅一个键值。
锁定整个数据库——冲突较少,但性能较差
在单个记录级别锁定 - 更多的锁,更好的性能
我们如何允许两种粒度?
意图模式锁定粗颗粒。
+ 授予
- 延迟
实践中的实际粒度锁
X | eXclusive lock 排他锁 |
S | Shared lock 共享锁 |
U | Update lock - 意图以后更新 |
IS | Intent to set Shared locks at finer granularity意图以更细的粒度设置共享锁 |
IX |
Intent to set shared or eXclusive locks at finer granularity 意图以更细的粒度设置共享或排他锁 |
SIX |
a coarse granularity Shared lock with an Intent to set finer granularity eXclusive locks粗粒度共享锁,意图设置更细粒度的排他锁 |
从根到叶获得锁。
从叶子到根释放锁。
IS:打算设置更精细的S锁
IX:打算设置更精细的 S 或 X 锁
SIX:S+IX
要在非根节点上获取 S 模式或 IS 模式锁,一个父节点必须处于 IS 模式或更高模式({IS,IX,S,SIX,U,X} 之一)。
要在非根节点上获取 X、U、SIX 或 IX 模式锁,所有父节点必须保持在 IX 模式或更高模式({IX,SIX,U,X} 之一)。
隔离概念...
树锁定和意图锁定模式
None :不锁定所有请求。
IS(意图拥有更精细级别的共享锁)允许更细粒度的 IS 和 S 模式锁,并防止其他人在此节点上持有 X。
IX(意图在更精细的级别拥有排他锁)允许以更精细的粒度设置 IS、IX、S、SIX、U 和 X 模式锁,并防止其他人在此节点上持有 S、SIX、X、U。
S (shared ) 允许更细粒度的节点及其后代的读取权限,并防止其他人在此节点上持有 IX、X、SIX。
SIX(共享和意图独占)允许像在 IS 中一样读取节点及其后代,并防止其他人在此节点或其后代上持有 X、U、IX、SIX、S,但允许持有者 IX、U 和 X 模式锁定在 粒度更细。 SIX = S + IX
U(更新锁)允许读取节点及其后代,并防止其他人在该节点或其后代上持有 X、U、SIX、IX 和 IS 锁。
X(排他锁)允许写入节点并防止其他人在此节点及其所有后代上持有 X、U、S、SIX、IX 锁。
粒度锁的兼容模式
乐观锁
当冲突很少时,事务可以在不管理锁和等待锁的情况下执行操作——更高的吞吐量
- 使用无锁数据
- 在提交之前,每个事务都会验证没有其他事务修改了数据(通过采取适当的锁)——锁的持续时间很短
- 如果发现任何冲突,事务将重复尝试
- 如果没有冲突,进行更改并提交
时间戳
这些是乐观并发控制的特例。 在提交时,检查时间戳。 如果时间戳比事务读取时间更新,则事务中止。
时域版本控制
数据永远不会被覆盖,更新时会创建新版本。
<o,<V1, [t1, t2)>, <V2, [t2,t3)>, <V3,[t3,*)>
在提交时,系统验证所有事务的更新并将更新写入持久媒体。 这种计算模型统一了并发、恢复和时域寻址。
T1
select average (salary)
from employee
T2
update employee
set salary = salary*1.1
where salary < $40000
如果事务 T1 首先开始并持有工资 < $40000 的员工记录的读锁,则 T2 将延迟到 T1 完成。 但是使用时间戳 T2 不必等待 T1 完成!
ok,今天内容比较少,后续会提供更详细的解释,辛苦大家观看!
第六篇:并发-粒度锁相关推荐
- 游标、事务并发和锁三者之间的那点事
对数据库学习的不断深入,对游标的认识也在逐渐加深,游标与事务.锁有着密不可分的关系. 无论是事务.锁还是游标相对于数据库来说最主要目的是保证数据的完整性.对事务并发.锁定的深入学习才能更加完善对游标的 ...
- java lock 对象_Java并发编程锁系列之ReentrantLock对象总结
Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...
- 高并发线程/锁/内存处理模型
文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...
- mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)
1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...
- java投票锁_Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...
- mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...
1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...
- insert时调用本身字段_MySQL RC级别下并发insert锁超时问题 - 案例验证
作者:网易数据库团队 DDB(网易杭研自研的MySQL数据库中间件产品)团队小伙伴发现了一个问题,觉得比较奇怪.于是找到我们,希望解释下.过程中除解释了问题的现象,也通过代码了解了更多的InnoDB ...
- Java核心篇之Java锁--day2
Java核心篇之Java锁–day2 乐观锁:乐观锁是一种乐观思想,即认为读多写少,每次去取数据的时候都认为其他人不会修改,所以不会上锁:但是在更新的时候会判断一下在此期间别人有没有去修改它,如果有人 ...
最新文章
- 性能提高和支持IE 9的新的ExtJS发布版:4.02和3.4
- python怎么读取列表-Python如何获取列表(List)的中位数
- 《杀死比尔1 Kill Bill Volume One》电影原声Cool!
- 【渝粤教育】国家开放大学2018年春季 7402-21T社会问题 参考试题
- Python3 爬虫学习笔记 C15【代理的基本使用】
- mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)
- C# Socket多线程编程实例
- 无法在C语言软件里敲字,网页上不能输入文字怎么办
- matlab 分级聚类,Matlab学习系列23. 模糊聚类分析原理及实现
- 不同调制方式的包络和功率谱
- 逻辑回归之ROC曲线的绘制
- 4款Bootstrap在线富文本编辑器
- 基于vue的html编辑器,基于vue富文本编辑器的慢慢人生路
- iconfont图标使用方法
- JS移动DOM节点,将某节点下所有子节点移动(剪切)到另一个节点下。新手很容易踩的坑!
- 使用RAK7268网关与RAK3172节点连接至TTN最新的服务器TTS上
- 成都中忻嘉业:抖音小店商品不出单,如何做好优化
- 认证授权中解决AuthenticationManager 无法注入
- 禾瑞亚科触摸屏驱动程序移植过程与遇到的问题--egalax_i2c
- 12306订票候补是个坑_12306的候补购票功能是好还是坏?