MySQL对于各种锁的概念理解
16lz
2021-12-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;
SELECT * FROM t_red_packet WHERE id = 1 LOCK IN SHARE MODE;
UPDATE t_red_packetSET user_id = 2
排它锁指的就是对于多个不同的事务,对同一个资源只能有一把锁。对某一资源加排它锁,自身可以进行增删改查,其他人无法进行加锁操作,更无法进行增删改操作。语法:select * from table for update
。
窗口1,在一个未结束的事务中给一条数据加上排它锁。
BEGIN;SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;
UPDATE t_red_packetSET user_id = 2
SELECT * FROM t_red_packet WHERE id = 1
SELECT * FROM t_red_packet WHERE id = 1 FOR UPDATE;
行锁
行锁就是给一行数据进行加锁。
表锁
表锁就是对一张表进行加锁。
总结
更多相关文章
- MySQL系列多表连接查询92及99语法示例详解教程
- Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
- MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
- android 电容屏(二):驱动调试之基本概念篇
- android从服务器下载文件(php+apache+win7+MySql)
- Android(安卓)Layout xml 中的几个概念
- 【有图】android通过jdbc连接mysql(附文件)
- Android中build target,minSdkVersion,targetSdkVersion,maxSdkVers
- Android(安卓)OpenGl ES2.0编程_相关概念与绘制顶点