MySQL这种用法千万要小心,一不注意就锁表

数据库 MySQL
今天有个小伙伴问我Mysql什么时候需要使用悲观锁,也就是在执行语句的时候带上For Update。教科书告诉我们,在一些对数据要求严格的,并且有着并发问题的场景。那么,是什么样的场景呢?

 今天有个小伙伴问我Mysql什么时候需要使用悲观锁,也就是在执行语句的时候带上For Update。教科书告诉我们,在一些对数据要求严格的,并且有着并发问题的场景。那么,是什么样的场景呢?

 

[[325023]]

 

我举一个例子,我们在网上买票,从锁定座位到出票其实是一个比较“漫长”的过程,那么就存在这样一个业务场景,可能在我们锁定座位的时候,另外一个事务把这场电影停售了。那么,接下来的事务执行,就可能会出现一些异常。

因为我们在执行购票的时候,虽然也需要查询电影的在售状态,但由于我们只是查询电影的在售状态,所以只能取到该行数据的一个读锁,除非事务级别为串行化,不然别的事务仍然可以对该行数据进行修改。所以,即便我们只是一个读操作,我们仍然希望对该行数据加上一个锁,让别的事务只能读取,而无法修改该行数据,这就是数据库的悲观锁。

我们可以使用Select * for update 这样的姿势来使用这个功能。要注意到,这个不同的使用方法,我们的锁级别是不一样的。

  1. 明确指定主键,并且主键存在,那么这是一个行级锁,如果主键不存在,那么并不会加锁。如果明确指定的是索引,那么满足该索引的所有行都会加上锁。
  2. 如果select条件中并没有命中主键或者索引,那么这将是一个表级锁,也就是整个表的数据都不能够变更,但是可以新插入数据。另外一种情况,是没有正确的使用到索引,例如使用不等于,like作为筛选条件。要注意的是,如果悲观锁锁表的话,并发将会大大降低,所以,使用for update的时候,切记要检查是否命中索引。

好了,今天的程序员经典面试题,数据库的悲观锁我们就学习到这里。

责任编辑:华轩 来源: 今日头条
相关推荐

2022-06-08 10:40:18

显卡矿卡暴跌

2019-12-26 15:16:35

分库分表选型流程

2020-02-11 08:02:26

千万级大表优化

2024-05-08 08:18:05

索引失效场景

2021-03-30 15:10:50

Java序列化

2020-10-20 13:50:47

MySQL数据库

2009-07-21 08:29:05

Windows 7系统AeroSnapWindows 7系统

2019-08-27 08:20:38

物联网IOT技术

2017-12-06 08:14:25

JavaScripBUG修复

2020-02-21 20:21:45

线程共享资源

2010-11-22 14:27:05

MySQL锁表

2020-12-16 10:28:05

Double浮点数计算

2014-11-10 18:53:28

2018-07-26 14:50:00

数据库MySQL大表优化

2021-02-07 07:40:31

Synchronize用法

2021-12-14 14:50:12

synchronizeJava

2010-11-22 15:19:28

Mysql临时表

2010-10-15 16:10:08

Mysql表别名

2024-05-16 11:36:00

2023-03-10 08:27:07

for循环项目线性结构
点赞
收藏

51CTO技术栈公众号