MySQ中Select * for update用法的示例分析

64次阅读
没有评论

共计 802 个字符,预计需要花费 3 分钟才能阅读完成。

本篇文章为大家展示了 MySQ 中 Select * for update 用法的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

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

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

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

明确指定主键,并且主键存在,那么这是一个行级锁,如果主键不存在,那么并不会加锁。如果明确指定的是索引,那么满足该索引的所有行都会加上锁。

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

上述内容就是 MySQ 中 Select * for update 用法的示例分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计802字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)