mysql数据库同步之悲观锁和乐观锁

shujutongbugongju shujutongbugongju     2022-12-19     153

关键词:

测试需要:本地开两个测试窗口

悲观锁它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。 
一个典型的倚赖数据库的悲观锁调用: 
select * from table where name=‘who am i‘ for update;
这条 sql 语句锁定了table表中所有符合检索条件( name=‘who am i‘ )的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。 Hibernate 的悲观锁,也是基于数据库的锁机制实现。

一个窗口开启一个事务但是不提交事务,执行select语句其中包含for update子语句。需要注意的是for update要放到mysql的事务中,即begin和commit中,否则不起作用。

技术图片

另一窗口尝试更新表

技术图片

我们可以看到报错了内容是:锁等待超时超过;试着重新启动事务

 这个时候我们提交事务

技术图片

 再次尝试更新时更新成功了

技术图片

 优点与不足

悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数

参考http://chenzhou123520.iteye.com/blog/1863407

乐观锁和悲观锁及cas实现

...别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。  ... 查看详情

协作式原创查漏补缺之乐观锁与悲观锁todo

面试官:你了解乐观锁和悲观锁吗?乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是对数据加锁(如MySQL中的排它... 查看详情

乐观锁和悲观锁

...想拿这个数据就会block直到它拿到锁。  传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。  Javasynchronized就属于悲观锁的 查看详情

乐观锁和悲观锁

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。  乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

悲观锁和乐观锁

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

悲观锁和乐观锁

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时候都... 查看详情

乐观锁和悲观锁

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

乐观锁和悲观锁

...修改该记录,等提交之后其他线程才可以获得锁,例如:数据库行锁,表锁,写锁,都是悲观锁乐观锁:每次去获取数据不会加锁,但是更新记录的时候会判断一下当前记录是否和自己读取的是否一致,不一致重新读取,再更新... 查看详情

乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

...别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。乐观... 查看详情

乐观锁和悲观锁的区别

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

乐观锁和悲观锁的区别

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

悲观锁和乐观锁(代码片段)

...阻塞,用完后再把资源转让给其它线程),传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲 查看详情

乐观锁和悲观锁

转:https://www.cnblogs.com/kismetv/p/10787228.html概念:乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的... 查看详情

一分钟教你认识悲观锁和乐观锁

...别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁(OptimisticLock),顾名思义,就是很乐观,每次去拿数据的时... 查看详情

乐观锁和悲观锁

在数据库锁机制中介绍过,DBMS中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术... 查看详情

悲观锁和乐观锁

...时就将数据锁住,直到更改完成才释放。一个典型的倚赖数据库的悲观锁调用:    select*fromaccountwherename=”Erica”forupdate  查看详情

乐观锁和悲观锁的区别(代码片段)

...想拿这个数据就会阻塞直到它拿到锁。  传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。  Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。2.... 查看详情

并发编程--锁(代码片段)

...是根据看待并发同步的角度。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被Java的并发包所引入。悲观锁悲观锁认为对于同一个数据的并发操作一定是会发生修改的,采取加锁的形式,悲观地认为,不加锁的并发操... 查看详情