MySQL对于各种锁的概念理解

 更新时间:2018年12月12日 11:19:16   作者:灰灰是菇凉呀  
今天小编就为大家分享一篇关于MySQL对于各种锁的概念理解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

乐观锁

乐观锁大多是基于数据版本记录机制实现,一般是给数据库表增加一个"version"字段。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

比如下单操作:

查询出商品信息。

select (quantity, version)
from t_goods
where id = #{id}

根据商品信息生成订单。

将商品数量减1。

update t_goods
set quantity = quantity - 1
where id = #{id} and version = #{version}

悲观锁

悲观锁依靠数据库提供的锁机制实现。MySQL中的共享锁和排它锁都是悲观锁。数据库的增删改操作默认都会加排他锁,而查询不会加任何锁。

共享锁(读锁)

共享锁指的就是对于多个不同的事务,对于一个资源共享同一个锁。对某一资源加共享锁,自身可可读该资源,其他人也可以读该资源(也可以再加共享锁,即共享锁共享多个内存),但无法修改。要想修改就必须等所有共享锁都释放完之后。语法:select * from table lock in share mode;

比如:

窗口1,在一个未结束的事务中给一条数据加上共享锁。

BEGIN;
SELECT * FROM t_red_packet WHERE id = 1 LOCK IN SHARE MODE;

窗口2,给同一条数据加上共享锁,加锁成功。

SELECT * FROM t_red_packet WHERE id = 1 LOCK IN SHARE MODE;

窗口1和窗口2,更新该行数据,提示[Err] 1205 - Lock wait timeout exceeded; try restarting transaction。需要等到所有共享锁释放,才可以进行update操作。

UPDATE t_red_packet
SET user_id = 2

排它锁(写锁)

排它锁指的就是对于多个不同的事务,对同一个资源只能有一把锁。对某一资源加排它锁,自身可以进行增删改查,其他人无法进行加锁操作,更无法进行增删改操作。语法:select * from table for update

窗口1,在一个未结束的事务中给一条数据加上排它锁。

BEGIN;
SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;

窗口1,更新该行数据,成功。

UPDATE t_red_packet
SET user_id = 2

窗口2,查询该行数据,可以查询到。

SELECT * FROM t_red_packet WHERE id = 1

窗口2给该条数据加锁,提示[Err] 1205 - Lock wait timeout exceeded; try restarting transaction

SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;

综上,共享锁就是大家一起来读,一起来共享锁,但谁都不要对锁着的数据进行修改,排它锁就是我自己就是想来修改,你们可以读,但你们都不能到锁,也不能对数据进行修改。

行锁

行锁就是给一行数据进行加锁。

表锁

表锁就是对一张表进行加锁。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • 浅谈MySQL 统计行数的 count

    浅谈MySQL 统计行数的 count

    这篇文章主要介绍了MySQL 统计行数的 count的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • MySQL查询进阶操作从函数到表连接的使用

    MySQL查询进阶操作从函数到表连接的使用

    这篇文章主要介绍了MySQL查询进阶从函数到表连接的使用,包括mysql函数的使用,MySQL的分组分页及查询关键字的执行顺序,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • SQL Server 2005 安装遇到的错误提示和解决方法

    SQL Server 2005 安装遇到的错误提示和解决方法

    在安装SQL Server 2005时有时会出现意想不到的问题,如IIS,性能计数器,OWC11,无法配置外围应用的问题,下面笔者分享一下在安装SQL Server 2005时常见问题解决方法
    2014-01-01
  • MySQL核心参数优化文件my.ini实现

    MySQL核心参数优化文件my.ini实现

    本文主要介绍了MySQL核心参数优化文件my.ini实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 浅谈mysql的子查询联合与in的效率

    浅谈mysql的子查询联合与in的效率

    本文是作者在实际产品测试中遇到的问题,继而作了相关总结,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • MySQL中LAG()函数和LEAD()函数的使用

    MySQL中LAG()函数和LEAD()函数的使用

    这篇文章主要介绍了MySQL中LAG()函数和LEAD()函数的使用,包括窗口函数的基本用法,LAG()和LEAD()函数介绍,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 详解用SELECT命令在MySQL执行查询操作的教程

    详解用SELECT命令在MySQL执行查询操作的教程

    这篇文章主要介绍了详解用SELECT命令在MySQL执行查询操作的教程,本文中还给出了基于PHP脚本的操作演示,需要的朋友可以参考下
    2015-05-05
  • PostgreSQL 正则表达式 常用函数的总结

    PostgreSQL 正则表达式 常用函数的总结

    这篇文章主要介绍了PostgreSQL 正则表达式 常用函数的总结的相关资料,对那些需要进行复杂数据处理的程序来说,正则表达式无疑是一个非常有用的工具,这里就介绍下如何使用,需要的朋友可以参考下
    2017-08-08
  • MySQL之select in 子查询优化的实现

    MySQL之select in 子查询优化的实现

    这篇文章主要介绍了MySQL之select in 子查询优化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • CMD命令操作MySql数据库的方法详解

    CMD命令操作MySql数据库的方法详解

    今天小编就为大家分享一篇关于CMD命令操作MySql数据库的方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论