mysql悲观锁的应用_mysql悲观锁

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个很是基础的概念。mysql

悲观锁(Pessimistic Lock)

悲观锁的特色是先获取锁,再进行业务操做,即“悲观”的认为获取锁是很是有可能失败的,所以要先确保获取锁成功再进行业务操做。一般所说的“一锁二查三更新”即指的是使用悲观锁。一般来说在数据库上的悲观锁须要数据库自己提供支持,即经过经常使用的select … for update操做来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,所以其余并发执行的select for update若是试图选中同一行则会发生排斥(须要等待行锁被释放),所以达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,所以必须在事务中使用。sql

这里须要注意的一点是不一样的数据库对select for update的实现和支持都是有所区别的,例如oracle支持select for update no wait,表示若是拿不到锁马上报错,而不是等待,mysql就没有no wait这个选项。另外mysql还有个问题是select for update语句执行中全部扫描过的行都会被锁上,这一点很容易形成问题。所以若是在mysql中用悲观锁务必要肯定走了索引,而不是全表扫描。数据库

使用例子编程

1.悲观锁须要等待提交commit后才能够执行并发

set autocommit = 0;

BEGIN;

SELECT * FROM `fook_business` where id = 1 FOR UPDATE;

UPDATE `fook_business` set `areas_id` = 2 where id = 1;oracle

ae00b22d174e3caf8a8a57011d9634a7.png

1ea38ae89f872fbd1250b687cc560491.png

2.然後手動更新 id=1 這條數據,看到更新失敗,因為 id=1 這條被鎖住了高并发

UPDATE `fook_business` set `areas_id` = 3 where id = 1;spa

849fcdfcb2c2d6475427f45e322196ec.png

3.commit提交成功设计

f577af96b1d10e602930b940648941d5.png

更新库存时,用mysql锁解决高并发问题的:https://mp.weixin.qq.com/s/gM_YT669SjJycflXTb_eBQblog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值