当前位置: 首页 > 科技观察

您必须小心使用MySQL的这种用法,一不留神就会锁表

时间:2023-03-21 00:01:22 科技观察

今天有朋友问我Mysql什么时候需要使用悲观锁,也就是在执行语句的时候带上ForUpdate。教材上告诉我们,在一些对数据要求严格,并发问题的场景下。那么,这是一个什么样的场景呢?让我举一个例子。我们在网上购票时,从锁定座位到出票,其实是一个比较“漫长”的过程。那么就有这样一个业务场景,在我们锁定座位的时候可能会发生。当时,另一件事使电影停止了。然后,在下一次事务执行时可能会出现一些异常。因为我们在买票的时候,还需要查询电影的销售情况,但是由于我们只查询电影的销售情况,所以只能拿到该行数据的读锁,除非事务级别是序列化的。否则,其他事务仍然可以修改行数据。所以,即使我们只是一个读操作,我们还是要给这行数据加锁,让其他事务只能读,不能修改这行数据。这就是数据库的悲观锁。我们可以通过选择*等手势来使用此功能以进行更新。需要注意的是,对于这种不同的使用方式,我们的锁级别是不同的。如果显式指定了主键,并且主键存在,那么这是一个行级锁。如果主键不存在,则不会加锁。如果明确指定了索引,则锁定所有满足该索引的行。如果select条件没有命中主键或索引,那么这将是一个表级锁,即不能改变整个表中的数据,但可以插入新数据。还有一种情况是索引没有正确使用,比如使用notequalto,like作为过滤条件。需要注意的是,如果对表进行悲观锁,并发度会大大降低。所以,在使用forupdate的时候,记得检查索引是否被命中。好了,今天的程序员经典面试题,数据库的悲观锁我们就学到这里了。