数据库共享锁(读锁)与排它锁(写锁)和 读写锁的实现原理

共享锁,又称之为读锁,简称S锁,当事务对数据加上读锁后,其他事务只能对该数据加读锁,不能做任何修改操作,也就是不能添加写锁。只有当数据上的读锁被释放后,其他事务才能对其添加写锁。共享锁主要是为了支持并发的读取数据而出现的,读取数据时,不允许其他事务对当前数据进行修改操作,从而避免”不可重复读”的问题的出现。

排它锁,又称之为写锁,简称X锁,当事务对数据加上写锁后,其他事务既不能对该数据添加读写,也不能对该数据添加写锁,写锁与其他锁都是互斥的。只有当前数据写锁被释放后,其他事务才能对其添加写锁或者是读锁。写锁主要是为了解决在修改数据时,不允许其他事务对当前数据进行修改和读取操作,从而可以有效避免”脏读”问题的产生。

读写锁的实现原理

先搞清楚读写锁要做什么。

基本就是 读读不互斥,读写互斥,写写互斥。可重入。

读行为

当写锁未获取,加上读锁(通知其他请求数据在读状态),读数据

当写锁被获取,等待,直到写锁未获取,加读锁,读数据

写行为

当写锁未获取,等待获取写锁

当写锁被获取,加写锁。读锁未获取,等待获取读锁

当写锁被获取,读锁被获取,写数据

参考资料:

浅谈数据库共享锁与排它锁 - 知乎 (zhihu.com)

redis 读写锁实现 - 云+社区 - 腾讯云 (tencent.com)

原文地址:https://www.cnblogs.com/FengZeng666/p/15163630.html