当前位置:首页 > 天道酬勤 > 正文内容

锁和信号量的区别(加乐观锁)

张世龙2021年12月20日 04:19天道酬勤410

目的:全部用于同时控制

乐观锁定的场景:主要用于读写少的场景

悲观锁定的场景:主要用于读写少的场景

悲观锁定定义:修改数据库中的数据时,其他事务可能会修改数据。 因此,通过锁定来控制数据的修改,防止同时发生的脏读、不可重复的读和幻读。

悲观锁定的实现:

1 .行锁或工作台锁,或读锁和写锁

虽然经常使用select…for update锁定数据,但需要注意几个锁定级别。 这是MySQL InnoDB的默认行级锁定。 由于所有行级锁定都是基于索引的,因此如果索引在一个SQL语句中不可用,则不使用行级锁定,而是将整个表锁定在表级锁定中,这一点需要注意。

可以使用java锁定方法(如同步)实现

悲观锁定的缺点:

1 .锁定会消耗数据库的资源

2 .可能发生死锁的问题

3 .并行性降低,一个事务结束后可以继续处理下一个事务

乐观锁定的定义:使用锁定机制,因为在处理数据库的数据修改时,其他事务对数据的修改可能很小。 这就是在提交更新数据时,查看数据库中的数据和提交的数据以检测是否有冲突,如果有冲突则不提交,如果没有冲突则提交数据。

实现乐观锁定:经常利用数据本身来保证数据的准确性,而不使用数据库中的锁定机制。

1 .如果用cas实现,就会发生ABA问题

2 .添加版本号字段进行控制

乐观锁定的好处:

1 .不发生死锁问题

2 .成功就执行,不成功就失败。 没有必要等待其他的同时锁定解除

悲观锁定和乐观锁定如何选择?

在乐观摇滚和悲观摇滚的选择上,主要看两者的不同和适用场景即可。

1响应效率:需要非常高的响应速度时,建议采用乐观的锁定方式。 成功就执行,不成功就失败。 不需要解除的其他同时锁定。 乐观的摇滚实际上没有锁定,而是高效的。 如果不能很好地掌握锁定的力量,更新失败的概率就会变高,容易导致业务失败。

2碰撞频率:碰撞频率非常高时,建议采用悲观锁定,保证成功率。 冲突频率高,如果选择乐观锁定,则需要多次重试才能成功,成本很高。

3重试成本:如果重试成本很高,建议使用悲观锁定。 悲观锁定依赖于数据库锁定,效率低下。 更新失败的概率比较低。

4乐观锁定如果有人在你之前更新,你的更新将被拒绝,用户必须能够进行新的操作。 悲观锁定等待上一次更新完成。 这也是不同的。

小知识点:

使用select…for update会锁定数据,但需要注意几个锁定级别。 因为MySQL InnoDB是缺省的低级锁定,所以如果不“显式”指定主键,MySQL就不会执行低级锁定。 否则,MySQL将执行表锁定

1 .明确指定主键,如果有此数据,则为row lock

2 .明确指定主键,如果没有该数据,则没有lock

3 .无主键,表锁定

4 .主键未知,表锁定

5 .显式指定索引,如果有此数据,则为row lock

6 .显式指定索引,如果没有此数据,则没有lock

共享锁定:也称为读锁定

1 .允许多个事务锁定共享数据

2 .任务事务只能去读,不能修改数据

3 .数据读取后,立即释放

排他锁:也称为写锁定

1 .只允许一个事务锁定数据

2 .此事务可以读取或写入数据

3 .该事务结束后获释

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25377.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。