加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

悲观锁与乐观锁怎么在Mysql中使用

发布时间:2022-02-15 19:07:41 所属栏目:MySql教程 来源:互联网
导读:悲观锁与乐观锁怎么在Mysql中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 悲观锁,认为数据是悲观的。当我们查询数据的时候加上锁。防止其他线程篡改,直到对方拿到锁,才能
       悲观锁与乐观锁怎么在Mysql中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
  
     悲观锁,认为数据是悲观的。当我们查询数据的时候加上锁。防止其他线程篡改,直到对方拿到锁,才能修改。
 
     比如,有如下的表。status=1表示可以下单,status=2表示不可以下订单。假如在并发的过程中有两个用户同时查到status=1,那么从逻辑上来说都可以去新增订单,但是会造成商品超卖。
 
如下例子
 
CREATE TABLE `goods` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `status` tinyint(4) DEFAULT NULL,
 `version` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4
INSERT INTO demo.goods (id, name, status, version) VALUES (1, 'test', 1, 1);
session1执行
 
set autocommit=0;
begin;
select *
from goods where id=1 and goods.status=1 for update ;
update goods set status=2 where id=1;
session2执行
 
begin;
select * from goods where id=1 for update;
这时候session2是阻塞的,因为锁还在session1,所以锁一直在等待。如果session1一直不提交,那么session2将在一定时间后超时断开连接,并且报
 
(1205, ‘Lock wait timeout exceeded; try restarting transaction')错误,
 
具体的锁等待时间可以通过设置innodb_lock_wait_timeout参数进行控制。
 
如果此时在session1中执行commit 操作,那么session2将得到查询结果,并把锁交给session2。
 
我们还可以通过
 
show status like 'innodb_row_lock_%';
来进一步查看锁信息。
 
乐观锁
 
乐观锁不同于悲观锁,乐观锁是通过自身的程序实现,而不是mySql自身实现。
 
乐观锁查询的时不上锁,只有在更新的时候检查版本号。
 
比如我们查询到goods表中version 为1 那么在更新这个表的时候Sql将是
 
select * from goods where id=1;
update goods set status=2,version=version+1 where id=1 and version=1;
这里的version是查询时候的版本号,每次更改将会导致version+1。如果版本号不匹配更新将不成功。
 
关于悲观锁与乐观锁怎么在Mysql中使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读