Mysql悲观锁和乐观锁的使用示例

 更新时间:2019年11月17日 11:07:41   作者:小星星  
这篇文章主要给大家介绍了关于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。如果版本号不匹配更新将不成功。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 在Win下mysql备份恢复命令

    在Win下mysql备份恢复命令

    假设mysql安装在c:盘,mysql数据库的用户名是root,密码是123456,数据库名是database_name
    2010-02-02
  • MySQL表中添加时间戳的几种方法

    MySQL表中添加时间戳的几种方法

    这篇文章主要介绍了MySQL表中添加时间戳的几种方法,有张表的数据需要用同步工具同步至其他库,需要 update_time 时间戳字段 来做增量同步,需要的朋友可以参考下
    2019-06-06
  • mysql过滤复制思路详解

    mysql过滤复制思路详解

    这篇文章主要介绍了mysql过滤复制的实现思路,主要讲解了两种思路,一种是在主库的binlog上实现另一种是从库的sql线程上实现,具体实现过程跟随小编一起看看吧
    2021-08-08
  • 解决MySQL5.7安装后没有data文件夹无法登录的问题

    解决MySQL5.7安装后没有data文件夹无法登录的问题

    这篇文章主要介绍了解决MySQL5.7安装后没有data文件夹无法登录的问题,需要的朋友可以参考下
    2016-04-04
  • mysql学习笔记之数据引擎

    mysql学习笔记之数据引擎

    插件式存储引擎是MySQL数据库最重要的特征之一,用户可以根据应用的需要寻找如何存储和索引数据、是否使用事务等。MySQL默认支持多种存储引擎,以适用于不同领域的数据库应用需求,用户可以通过选择选择不同的存储引擎提供应用的效率,提供灵活的存储
    2017-02-02
  • MySQL中时间函数操作大全

    MySQL中时间函数操作大全

    在使用SQL语言进行数据查询和数据分析中,常常需要借助日期时间函数来计算相关的指标或生成日期辅助列,下面这篇文章主要给大家介绍了关于MySQL中时间函数操作的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 阿里云Centos 7.5安装Mysql的教程

    阿里云Centos 7.5安装Mysql的教程

    这篇文章主要介绍了阿里云Centos 7.5安装Mysql的教程,需要的朋友可以参考下
    2017-07-07
  • MySQL使用聚合函数进行单表查询

    MySQL使用聚合函数进行单表查询

    这篇文章主要介绍了MySQL使用聚合函数进行单表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • MySQL备份与恢复之真实环境使用冷备(2)

    MySQL备份与恢复之真实环境使用冷备(2)

    这篇文章主要介绍了MySQL备份与恢复之真实环境使用冷备,需要的朋友可以参考下
    2015-08-08
  • 使用Shell脚本操作多个MySQL数据库的步骤详解

    使用Shell脚本操作多个MySQL数据库的步骤详解

    本文介绍如何通过Shell脚本批量操作多个MySQL数据库,包含创建数据库信息文件、编写执行脚本、准备SQL文件及设置权限等步骤,实现自动遍历连接各数据库并执行指定SQL语句创建表的操作,需要的朋友可以参考下
    2025-08-08

最新评论