悲观锁和乐观锁

悲观锁和乐观锁面试

 

这个问题一直是面试中常常被问到的,可是每次被问到都懵啊,而后今天就在网上了解了一下,只是我的理解,嘿嘿!sql

 

首先悲观锁 ,顾名思义就是它是一个悲观的锁,每次都惧怕别人去访问他,因此给本身加了个把锁,多是一行或者整个表。举个例子:数据库

首先创建一张user表并发

开启一个窗口,开始一个事务线程

BEGIN;rest

select * from user where name ='bb' for update(为name=bb的记录加修改锁)事务

 

再开启另外一个窗口it

 

update user set name='cc' where id =1io

 

发现sql一直在执行中,最后会抱一个错误,以下微博

[SQL]

update user set name='cc' where id =1

 

[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

 

直到我在第一个事务中执行commit ,这个才会修改经过

 

乐观锁

 

固然它是那么的乐观,觉得别人不会改变你的记录,可是他会每次在你提交语句的时候检查更新,它的策略是添加一个version版本,即为数据增长一个版本标识,在每次作写操做的时候version++,而后比对第一次和第二次的操做对比,若是提交的数据版本号大于数据库表当前版本号,则予以更新,不然认为是过时数据。

 

对于他们的不一样使用场景我仍是有点不甚明了,固然他们确定都是用于并发操做。而且也可使用并发线程锁lock去实现,为什么还要使用这两种锁机制呢?但愿看到此微博的大森们能够给予解答~

相关文章
相关标签/搜索