锁的类型以及粒度,两段锁协议,隐式和显示锁

锁的粒度

行级锁 表级锁

应尽量只锁定需要修改的那部分数据,而不是所有资源。锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高。

加锁需要消耗资源,锁的各种操作都会增加系统开销。因此锁的粒度越小,系统开销就越大。

在选择锁的粒度时,需要在锁开销和并发程度之间作一个权衡

锁的类型

1.读写锁

  • 排他锁,简写为X锁,又称写锁
  • 共享锁,简写为S锁,又称读锁

规定:

  • 事务对数据对象A加了X锁,就可以对A进行读取和更新。加了X锁,其他事务就不能再对该数据加锁了
  • 事务对数据对象A加了S锁,就可以对A进行读取操作,但不能进行写操作,其他事务可以对A加S锁,但不能加X锁。
    即只有S锁和S锁时兼容的

2.意向锁

避免加表锁前逐行确认是否加了锁。逐行确认太过麻烦。
意向锁的作用:
假如事务A想要申请整个表的写锁,那么它需要逐行判断是否有读锁或写锁存在,效率太低。
意向锁就是在加锁前,先对该表加一个意向锁(IX或IS)。这样之后再有事务要申请表的X可以直接判断表上是否有S\X\IX\IS存在,有的话就先阻塞。

意向锁是在原有的X/S锁之上引入IX/IS,IX/IS都是表锁,用来表示一个事务想要在表中的某个数据行上加X锁或S锁。有以下两个规定:

  • 一个事务在获得某个数据行对象的S锁之前,必须先获得表的IS锁
  • 一个事务在获得某个数据行对象的X锁之前,必须先获得表的IX锁

各种表的兼容关系(能否在有另一个锁的时候加锁):
IX\IS之间两两兼容,X\S之间只有S\S兼容
X和任何锁都不兼容,S锁还和IS锁兼容
综上:只有IS\IX之间,S锁和IS、S之间兼容,其它均不兼容

MySQL四种锁的兼容关系.png

三级封锁协议

一级封锁协议

事务T要修改数据A必须先加写锁X,写完再释放。由于X锁之间不兼容。
故解决了数据写覆盖的问题。
但不能解决脏读问题

二级封锁协议

在一级封锁协议的基础上,要求读取数据时必须加S锁,读取完马上释放S锁

可以解决脏读问题。事务A不会读到事务B修改了但没提交的可能的脏数据。

三级封锁协议

在二级的基础上,加了S锁,但在事务结束的时候才释放S锁。
解决了不可重复读问题。因为在事务没有释放S锁之前,没有其它事务能够修改该数据

两段锁协议

两段锁协议规定所有的事务应遵守的规则:
  ① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
  ② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
充分条件,不是必要条件

MySQL隐式和显示锁定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 引言 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问变得有序所设计的一种规则;对...
    高级java架构师阅读 760评论 0 1
  • 死锁产生的原因和解锁的方法 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用。 (2) ...
    憩在河岸上的鱼丶阅读 1,542评论 0 4
  • 这种红晶晶的小果实,吸引了我的眼球,也吸引了如月。 小家伙,摘到一颗放进嘴里。很是满足。紧接着就是怪异的表情。因为...
    吉祥凤玲阅读 227评论 0 0
  • 今天周日,佳琪还有作业没有写完,吃过饭后磨蹭了很久,在我的催促下才去写了作业。中间有同学来找她,可是没完成作...
    A宝_8f50阅读 257评论 0 0
  • 创建窗口 1.初始化pygame 2.创建游戏窗口 3.游戏循环 显示文字 设置窗口的背景颜色 1.创建字体对象 ...
    剑眉星目cz阅读 559评论 0 3

友情链接更多精彩内容