MySQL FOR UPDATE 锁的一点问题

问题描述 假设一个情况,这里只是假设,真实的情况可能不会这样设计,但是假如真的发生了….铁老大有一张这样的ticket表,用来存

问题描述

假设一个情况,这里只是假设,真实的情况可能不会这样设计,但是假如真的发生了….
铁老大有一张这样的ticket表,用来存放北京到上海的票。

iduidstart_addrend_addrbook_time

11300009860上海北京13866660321

20上海北京 

30上海北京 

40上海北京

uid 不等于0 并且 book_time 不等于0,则表示已售出,不许再更改。
年底了,大家开始抢了,当某一个人开始抢的时候,铁老大这样做了,当A开始抢的时候,从表中所有uid=0的记录中随机取出一条,然后修改当前记录的uid为A的uid,,book_time为当前时间。

那么好了,这个时候并发产生了,10000个人同时抢最后剩下的10张票,有2个人A,B同时读取了uid=0 and id=2的记录,然后A把uid修改为自己的,book_time修改timeA,系统通知A抢票成功 紧接着,B同样修改了这条记录为自己的,那么这个时候A的票就失效了。

这里就考虑使用锁机制了,如果在A读取了这条记录后,并把这条记录加上写锁,那么别人就无法再读取加锁,也就不会修改多次了。

实验结果
实验了一下for update 加锁,然后发现了一些问题。
1、当我们使用主键查询去加锁的时候,可以对这条记录加行锁
打开一个终端:执行一下代码:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from ticket where id = 2 for update;

那么 id=2这个记录就会被加行写锁。
令一个终端将无法读取该记录,但是却可以读取其他记录
#可以读取加锁
mysql> select * from ticket where id = 3 for update;
#不可以读取
mysql> select * from ticket where id = 2 for update;

2、但是当我们按非主键查询会怎样呢

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from ticket where uid = 0 limit 1 for update;

那么这个时候,这个表会被锁住,任何记录都不能再读取加锁
//不可读取,等待释放锁
mysql> select * from ticket where id = 1 for update;
//不可读取等待释放锁
mysql> select * from ticket where uid = 0 limit 1 for update;

但是表锁会减少并发。
结论
有没有一种方法,可以在非主键字段查询一条记录时上实现加行写锁,期待高手支招。

linux

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1874649.html

(0)
上一篇 2025年2月22日 09:37:04
下一篇 2025年2月22日 09:37:38

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • MySQL SELECT同时UPDATE同一张表

    MySQL不允许SELECT FROM后面指向用作UPDATE的表,有时候让人纠结。当然,有比创建无休止的临时表更好的办法。本文解释如何UPDATE mysql不允许select from后面指向用作update的表,有时候让人纠结。当然,…

    数据库 2025年2月22日
    300
  • MySQL update嵌套

    当我们想从MySQL中的表table1中取出id=5的列col1(例如: 博客当前访问量)中的数据d1, 并将table1的属性p1更新为d1+1的时候, 我们也 当我们想从mysql中的表table1中取出id=5的列col1(例如: 博…

    数据库 2025年2月22日
    300
  • MySQL不需循环update多条记录

    UPDATE 查询比较棘手,因为你不能简单地写进去多个值。不同情况下,我用不同的方法解决。如果你确信将要update的记录是存在的,那 update 查询比较棘手,因为你不能简单地写进去多个值。不同情况下,,我用不同的方法解决。如果你确信将…

    数据库 2025年2月22日
    300

发表回复

登录后才能评论