时间:2021-05-24
乐观锁
乐观锁大多是基于数据版本记录机制实现,一般是给数据库表增加一个"version"字段。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
比如下单操作:
查询出商品信息。
select (quantity, version)from t_goodswhere id = #{id}根据商品信息生成订单。
将商品数量减1。
update t_goodsset quantity = quantity - 1where 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_packetSET user_id = 2排它锁(写锁)
排它锁指的就是对于多个不同的事务,对同一个资源只能有一把锁。对某一资源加排它锁,自身可以进行增删改查,其他人无法进行加锁操作,更无法进行增删改操作。语法:select * from table for update。
窗口1,在一个未结束的事务中给一条数据加上排它锁。
BEGIN;SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;窗口1,更新该行数据,成功。
UPDATE t_red_packetSET 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;综上,共享锁就是大家一起来读,一起来共享锁,但谁都不要对锁着的数据进行修改,排它锁就是我自己就是想来修改,你们可以读,但你们都不能到锁,也不能对数据进行修改。
行锁
行锁就是给一行数据进行加锁。
表锁
表锁就是对一张表进行加锁。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。如果你想了解更多相关内容请查看下面相关链接
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了mysql悲观锁与乐观锁。分享给大家供大家参考,具体如下:悲观锁与乐观锁是人们定义出来的概念,你可以理解为一种思想,是处理并发资源的常用手段。不要
1.mysql数据库的组成与相关概念首先明白,mysql是关系型数据库,和非关系型数据库中最大的不同就是表的概念不一样。+整个mysql环境可以理解成一个最大的
本文意在弄清楚这些概念间的关系及其作用。弄清Mysql在开启事务的情况下,每条sql执行时的加锁操作和MVCC版本控制。为使讨论简单,本文忽略了GAP锁(间隙锁
互斥锁和信号量都是操作系统中为并发编程设计基本概念,互斥锁和信号量的概念上的不同在于,对于同一个资源,互斥锁只有0和1的概念,而信号量不止于此。也就是说,信号量
MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁.**行级锁**行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操