目录

并发事务 – 冲突和性能问题

锁的粒度

实践中的实际粒度锁

隔离概念...树锁定和意图锁定模式

乐观锁

时间戳


并发事务 – 冲突和性能问题

多个并发运行的事务可能会导致冲突
- 我们仍然尽量允许并发运行以获得更好的性能,同时尽可能避免冲突

一个新的解决方案:
使用粒度锁——我们需要建立一些层次结构,然后可以在任何级别上获取锁,这将自动授予其后代锁。

锁的粒度

主意:
选择一组列值(谓词)。
它们形成图/树结构。
锁定此图/树中的节点

它允许锁定整个数据库、整个文件或仅一个键值。

锁定整个数据库——冲突较少,但性能较差
在单个记录级别锁定 - 更多的锁,更好的性能

我们如何允许两种粒度?
意图模式锁定粗颗粒。
+ 授予
- 延迟

实践中的实际粒度锁

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,今天内容比较少,后续会提供更详细的解释,辛苦大家观看!

第六篇:并发-粒度锁相关推荐

  1. 游标、事务并发和锁三者之间的那点事

    对数据库学习的不断深入,对游标的认识也在逐渐加深,游标与事务.锁有着密不可分的关系. 无论是事务.锁还是游标相对于数据库来说最主要目的是保证数据的完整性.对事务并发.锁定的深入学习才能更加完善对游标的 ...

  2. java lock 对象_Java并发编程锁系列之ReentrantLock对象总结

    Java并发编程锁系列之ReentrantLock对象总结 在Java并发编程中,根据不同维度来区分锁的话,锁可以分为十五种.ReentranckLock就是其中的多个分类. 本文主要内容:重入锁理解 ...

  3. 高并发线程/锁/内存处理模型

    文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...

  4. mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)

    1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...

  5. java投票锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  6. java 共享锁 独占锁_Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家取排队本着先来 ...

  7. mysql如果索引为uid间隙锁_mysql 开发进阶篇系列 10 锁问题 (使用“索引或间隙锁”的锁冲突)...

    1.使用"相同索引键值"的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例 ...

  8. insert时调用本身字段_MySQL RC级别下并发insert锁超时问题 - 案例验证

    作者:网易数据库团队 DDB(网易杭研自研的MySQL数据库中间件产品)团队小伙伴发现了一个问题,觉得比较奇怪.于是找到我们,希望解释下.过程中除解释了问题的现象,也通过代码了解了更多的InnoDB ...

  9. Java核心篇之Java锁--day2

    Java核心篇之Java锁–day2 乐观锁:乐观锁是一种乐观思想,即认为读多写少,每次去取数据的时候都认为其他人不会修改,所以不会上锁:但是在更新的时候会判断一下在此期间别人有没有去修改它,如果有人 ...

最新文章

  1. 性能提高和支持IE 9的新的ExtJS发布版:4.02和3.4
  2. python怎么读取列表-Python如何获取列表(List)的中位数
  3. 《杀死比尔1 Kill Bill Volume One》电影原声Cool!
  4. 【渝粤教育】国家开放大学2018年春季 7402-21T社会问题 参考试题
  5. Python3 爬虫学习笔记 C15【代理的基本使用】
  6. mysql数据库group_key_【MySQL】数据库复制:组复制(Group Replication)
  7. C# Socket多线程编程实例
  8. 无法在C语言软件里敲字,网页上不能输入文字怎么办
  9. matlab 分级聚类,Matlab学习系列23. 模糊聚类分析原理及实现
  10. 不同调制方式的包络和功率谱
  11. 逻辑回归之ROC曲线的绘制
  12. 4款Bootstrap在线富文本编辑器
  13. 基于vue的html编辑器,基于vue富文本编辑器的慢慢人生路
  14. iconfont图标使用方法
  15. JS移动DOM节点,将某节点下所有子节点移动(剪切)到另一个节点下。新手很容易踩的坑!
  16. 使用RAK7268网关与RAK3172节点连接至TTN最新的服务器TTS上
  17. 成都中忻嘉业:抖音小店商品不出单,如何做好优化
  18. 认证授权中解决AuthenticationManager 无法注入
  19. 禾瑞亚科触摸屏驱动程序移植过程与遇到的问题--egalax_i2c
  20. 12306订票候补是个坑_12306的候补购票功能是好还是坏?

热门文章

  1. Blockchain与Big Data将碰撞出怎样的火花?
  2. 关于CVPR 2019投稿的一些感想
  3. Facebook加入AI芯片大战,挖走Google芯片产品开发负责人
  4. Springboot中优雅进行字段校验
  5. 阿里巴巴为什么不建议直接使用Async注解?
  6. 国产最强开源 API 网关,没有之一,不接受任何反驳!
  7. MyBatis-Plus 看这篇就够了
  8. 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧
  9. 你还在 select * 吗?
  10. 机器学习项目的备忘清单!