设为首页 收藏本站
查看: 456|回复: 0

[经验分享] MySql FOR UPDATE 锁的一点问题……

[复制链接]

尚未签到

发表于 2018-9-29 14:03:20 | 显示全部楼层 |阅读模式
  问题描述
  假设一个情况,这里只是假设,真实的情况可能不会这样设计,但是假如真的发生了....
  铁老大有一张这样的ticket表,用来存放北京到上海的票。
iduidstart_addrend_addrbook_time11300009860上海北京1386666032120上海北京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这个记录就会被加行写锁。
  令一个终端将无法读取该记录,但是却可以读取其他记录
#可以读取加锁
  
mysql> select * from ticket where>  
#不可以读取

  
mysql> select * from ticket where>  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>  
//不可读取等待释放锁
  
mysql> select * from ticket where uid = 0 limit 1 for update;
  但是表锁会减少并发。
  结论
  有没有一种方法,可以在非主键字段查询一条记录时上实现加行写锁,期待高手支招。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-603899-1-1.html 上篇帖子: mysql 删除 主从信息 下篇帖子: Mysql5.6.21-GTID双主半同步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表