数据库--锁机制

1.共享读锁
共享读锁是基于存储引擎MyISAM中读锁的,MyISAM是表锁。

首先是事务A加读锁,此时自己是可以进行读操作的。
在这里插入图片描述
在事务B中再进行查询操作,发现仍然是可以的。
在这里插入图片描述
可以得出读锁read是共享读锁,即一个事务添加读锁的时候,其他的事务也可以读。

2.独占写锁
它也是基于存储引擎MyISAM中写锁。

(1)事务A自己加读锁,然后自己进行写操作,发现提示错误,是不允许的。
在这里插入图片描述
(2)事务A加读锁,在事务B中写操作呢?
在这里插入图片描述
那么会出现等待的情况,等待事务的读锁解锁之后,它才会修改成功。
在这里插入图片描述
(3)事务A加写锁,此时它自己是可以进行读和写操作的。
在这里插入图片描述
(4)事务A加写锁,事务B进行读取,会出先等待的情况,等事务A解锁后,才会输出。
原来的数据是这样的:
在这里插入图片描述
随后事务A加写锁,事务B查询会等待,事务A解锁后,才会查询出内容。
在这里插入图片描述
(5)事务A加写锁,事务B修改呢?
仍然会阻塞,而且事务A解锁后才修改成功。

综上,如果事务A添加了写锁,那么事务B无论是读还是写都是不可以的,即写锁与读锁、写锁都是不兼容的,所以称写锁为独占写锁

3.共享锁
共享锁是基于存储引擎INnoDB中读锁的,INnoDB是行锁(粒度小)
读锁是这样加的:
在这里插入图片描述
此时,在事务B中添加读锁也是可以的:
在这里插入图片描述
可以得出,读锁和读锁是共享的,所以称之为共享锁

4.排它锁
排它锁基于存储引擎INnoDB中写锁。
如下是加写锁的样例,因为是行锁,所以加锁的时候需要指定某一行:
test表中的数据
加锁样例:
在这里插入图片描述
现在就是加上了写锁。

下一步就是验证加上写锁之后,其他的事务都可以做些什么呢?
在这里由于INnoDB支持事务,而一句查询语句也是事务,在事务结束后,即分号之后,会把所有的锁、资源都释放掉。
事务A加写锁:
在这里插入图片描述
事务B无论是读取还是修改都是可以的:
在这里插入图片描述

---------------------------
接下来为了更好的说明排它锁,将事务的自动提交修改一下:

在这里插入图片描述
那么这个时候事务A加写锁后,看看B事务可以进行什么操作?
(1)修改本行
在这里插入图片描述
如果对已经枷锁的id = 001的这一行修改,那么会失败并阻塞,一段时间后就会提示超时。
(2)修改其他行
给事务A中id = 001加写锁:
在这里插入图片描述
修改id = 002的操作成功:
在这里插入图片描述
(3)查询
在事务A中id = 001添加写锁后,在事务B中查询
在这里插入图片描述
此时要说明一点,就是在INnoDB中,select是不加锁的,insert、update、delete是加写锁的,所以此时是可以操作成功的。
(4)加读锁
这才是真正的加读锁,发现读锁和写锁是不兼容的:
在这里插入图片描述
发现加读锁会失败,阻塞。
综上,写锁和读锁不共存、写锁和写锁不共存,所以称之为排它锁

注意:
在这里还有一种情况,就是在加锁的时候,锁并没有加在主键上,此时锁的粒度会增大,变成了表锁。
在这里插入图片描述
前面我们已经验证过,如果是只有id = 001这一行锁住了,那么修改id = 002会成功,但是现在失败了,阻塞,只能说明锁是表锁,把整张表都锁住了。
这个时候就是如果是索引查询,列属性有索引结构,那么就是行锁;如果没有索引结构,那么就是表锁

5.悲观锁
提前加锁:MyISAM表锁、INnoDB行锁
6.乐观锁
添加版本标识
7.意向锁
防止死锁
8.间隙锁
解决幻读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Quartz中,数据库集群是一种高可用性的解决方案。它允许多个Quartz实例共享同一个数据库,并且能够自动协调任务的执行,从而保证任务的可靠性和稳定性。 但是,在多个Quartz实例同时操作同一个数据库时,必须确保它们之间的数据一致性。这就需要使用锁机制来保证数据的正确性和安全性。 Quartz提供了两种类型的锁:悲观锁和乐观锁。它们分别采用不同的方式来保证数据的一致性。 1. 悲观锁 悲观锁是一种悲观的认为并发环境下会出现冲突的锁机制。它在操作数据时,会先加锁,然后再进行操作,操作完成后再释放锁。 在Quartz中,悲观锁是通过数据库中的行级锁来实现的。当一个Quartz实例要对某个任务进行操作时,它会先获取该任务的行级锁,然后再进行操作。其他实例在此期间无法获取该任务的锁,从而保证了数据的一致性。 2. 乐观锁 乐观锁是一种乐观的认为并发环境下不会出现冲突的锁机制。它在操作数据时,不会加锁,而是通过版本号等方式来判断数据是否发生了变化。 在Quartz中,乐观锁是通过版本号来实现的。每个任务都有一个版本号,当一个Quartz实例要对某个任务进行操作时,它会先获取该任务的版本号,然后进行操作。如果在此期间该任务的版本号发生了变化,则说明其他实例已经对该任务进行了操作,当前实例的操作会失败,需要重新获取版本号并重试。这样可以保证数据的一致性。 总的来说,悲观锁适用于高并发、数据冲突严重的场景,但是会带来较大的性能开销;而乐观锁适用于并发量较小、数据冲突不严重的场景,性能开销较小。在Quartz中,可以根据具体的业务需求选择合适的锁机制来保证数据的正确性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值