问题描述

假设一个情况,这里只是假设,真实的情况可能不会这样设计,但是假如真的发生了....铁老大有一张这样的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;

但是表锁会减少并发。

结论

有没有一种方法,可以在非主键字段查询一条记录时上实现加行写锁,期待高手支招。

mysql for update 锁_MySql FOR UPDATE 锁的一点问题……相关推荐

  1. mysql suoyin 和锁_Mysql索引与锁

    Mysql索引与锁 Mysql索引与锁 本文以Mysql5.7为例测试. 1:mysql索引方法 Mysql的索引方法分为btree索引和hash索引. hash索引:是通过hash计算后比较,所以只 ...

  2. mysql 表级锁_MySQL行级锁和表级锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  3. mysql表级锁和行级锁_MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  4. mysql a锁_MYSQL中的锁

    前言 刚开始接触MYSQL,对其锁机制并不了解,在项目里面,针对死锁以及锁竞争,约定了两条规则. 对涉及多个业务表的更新,要遵守一定的顺序,如按照TABLE-A,TABLE-B,TABLE-C的次序 ...

  5. MySQL并发 共享锁目的_mysql并发与锁机制

    在InnoDB中,锁是逐步获得的,因此发生死锁是可能的.发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并回退,另外一个事务获得锁,并继续完成事务.但在涉及外部锁,或涉及表锁的情况下,I ...

  6. mysql普通查询排他锁_MySql 共享锁 排他锁

    行级锁是 MySQL 中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突,行级锁分为共享锁和排他锁两种. 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁.其他用户可以并发读取 ...

  7. mysql默认乐观锁悲观锁_MySQL中悲观锁和乐观锁到底是什么?-阿里云开发者社区...

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁. 行锁就是按 ...

  8. mysql中的乐观锁_MySQL中悲观锁和乐观锁到底是什么?

    索引和锁是数据库中的两个核心知识点,隔离级别的实现都是通过锁来完成的 按照锁颗粒对锁进行划分 ? 锁用来对数据进行锁定,我们可以从锁定对象的粒度大小来对锁进行划分,分别为行锁.页锁和表锁.行锁就是按照 ...

  9. MySQL 共享排他锁_mysql 共享排他锁

    1.基础知识 共享锁又叫S锁(Share Locks),共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又叫X锁(eXclusive Locks,记为X锁), ...

最新文章

  1. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾
  2. GDB中应该知道的几个调试方法
  3. 【网络安全】一些webshell免杀的技巧
  4. 参加51CTO培训,华为HCNP认证考试通过啦
  5. 循序渐进db2 第3版_「图书推荐」焊接工程师手册第3版
  6. ASP.NET(第七章数据插入与更新:DataList)-asp.net关注
  7. java preference xml,java – 找不到PreferenceScreen类
  8. 黑客炸弹弹窗假装自己是黑客
  9. 几何实体图形保存成stl格式的ascII和二进制文。用Vc++语言读入文件,给三角网格坐标值乘以2,并保存到另一stl文件。输出完成工作所用的执行时间
  10. K8S标签和污点容忍
  11. UDP头部结构,UDP校验和计算
  12. 室内定位技术之UWB篇
  13. http协议 服务器主动下发,HTTP协议快速入门指南
  14. A detailed derivation for the Bias Variance tradeoff Decomposition
  15. 记录个js调用浏览器打印功能的代码
  16. 计算机及统计学,统计学中及计算机视觉中的各种 距离 汇总。。。
  17. 【DP学习总结】区间DP
  18. 公众号的发文和留言都会显示城市了!来试试!
  19. android内存最小版本下载,猫和老鼠精简版下载-猫和老鼠内存最小版下载v6.6.1 安卓版-芒果手游网...
  20. java实现第七届蓝桥杯平方末尾

热门文章

  1. 玩转ceph性能测试---对象存储(一)
  2. Elasticsearch学习(2)—— 常见术语
  3. SQL SERVER 表分区
  4. 《树莓派实战秘籍》——1.17 技巧17添加重启按钮
  5. MySQL 日志文件 说明
  6. C#写文本文件如何写入回车换行符?
  7. 初读CLR Via C# 之 IL、CTS、CLS
  8. 用JS访问iframe中的元素
  9. 湖南(包括岳阳)的交通规划
  10. 一个封装了的选项卡效果js