您现在的位置是:网站首页> 编程资料编程资料
Mysql悲观锁和乐观锁的使用示例_Mysql_
2023-05-27
338人已围观
简介 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 8.0.13 安装配置图文教程_Mysql_
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'_Mysql_
- ERROR 1862 (HY000): Your password has expired. To log in you must change it using a ....._Mysql_
- CentOS 6.2 安装 MySQL 5.7.28的教程(mysql 笔记)_Mysql_
- Windows 下 MySQL 8.X 的安装教程_Mysql_
- CentOS 7 安装解压版mysql5.7的教程_Mysql_
- MySql实现翻页查询功能_Mysql_
- MYSQL的主从复制知识点整理_Mysql_
- MySQL给新建用户并赋予权限最简单的方法_Mysql_
- win10下mysql 8.0.18 安装配置方法图文教程(windows版)_Mysql_
