数字经济最新消息,windows优化大师怎么用,个人网站效果,怎样做好营销宣传文章目录介绍加锁情况分析明确指定主键#xff0c;并且数据真实存在#xff0c;锁定行明确指定主键#xff0c;但数据不存在#xff0c;不加锁主键不明确#xff0c;锁定整个表无主键#xff0c;锁定整个表应用场景介绍
1.FOR UPDATE 加的锁是一种行级排他锁#xff0c…
文章目录介绍加锁情况分析明确指定主键并且数据真实存在锁定行明确指定主键但数据不存在不加锁主键不明确锁定整个表无主键锁定整个表应用场景介绍
1.FOR UPDATE 加的锁是一种行级排他锁也是一种悲观锁 2.加锁的事务可以查询也可以修改被加锁的数据行其它事务只能查询但不能修改被加锁的数据行而且其它事务不能再往这个数据行加任何类型的锁 3.FOR UPDATE 给行加锁必须在事务控制模块中才能生效 4.FOR UPDATE 仅适用于 InnoDB 5.MyISAM 只支持表级锁InnoDB 支持表级锁和行级锁
注不显式执行 START TRANSACTION执行 DML 语句也是一个事务默认自动提交。
什么时候释放锁
1.执行提交或回滚语句 2.退出数据库 3.程序停止运行
加锁情况分析
查询 InnoDB 表数据时只有查询条件中明确指定主键值MySQL 才会锁定行否则 MySQL 将会锁定整个表。
假设有下面这张表及数据
mysql select * from user;
--------------------------------
| id | NAME |
--------------------------------
| 00000000000000000001 | zhangsan |
| 00000000000000000002 | lisi |
| 00000000000000000003 | libai |
--------------------------------
3 rows in set (0.00 sec)注ID 是主键。
明确指定主键并且数据真实存在锁定行
START TRANSACTION; -- 开始事务
SELECT * FROM user WHERE id00000000000000000003 FOR UPDATE;
SELECT * FROM user WHERE id00000000000000000003 and namelisi FOR UPDATE;明确指定主键但数据不存在不加锁
SELECT * FROM user WHERE id0 FOR UPDATE;主键不明确锁定整个表
SELECT * FROM user WHERE id3 FOR UPDATE;
SELECT * FROM user WHERE id LIKE %3% FOR UPDATE;注意不管是否查询到记录都会锁定表。
无主键锁定整个表
SELECT * FROM user WHERE namelibai FOR UPDATE;应用场景
比如火车票订票在手机屏幕上显示有票如果没有锁定相关数据在真正进行出票扣减锁票时你必须重新确定一下这个数据有没有被其他客户端修改过。如果你使用了行级锁则可以直接出票所以这个业务场景可以使用 FOR UPDATE 对数据进行加锁。