mysql for update 锁_MySql FOR UPDATE 锁的一点问题……

问题描述

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

但是表锁会减少并发。

结论

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器机房新风系统,某机房新风系统设计方案参考

《某机房新风系统设计方案参考》由会员分享,可在线阅读,更多相关《某机房新风系统设计方案参考(3页珍藏版)》请在人人文库网上搜索。1、某机房新风系统设计方案参考根据以上要求并结合中华人民共和国电子计算机机房的设计规范,为保证机房正压…

css 画三角形

CSS三角形绘制方法#triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;}#triangle-down {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid trans…

面试官面试前端_如何面试面试官

面试官面试前端by Aline Lerner通过艾琳勒纳(Aline Lerner) 如何面试面试官 (How to interview your interviewers) For the last few semesters, I’ve had the distinct pleasure of guest-lecturing MIT’s required technical communication class for computer science m…

shell 字符串分割

语法1: substring${string:start:len} string的下标从0开始,以start可是,截取len个字符,并赋值于substring 1 #!/bin/bash 2 #substr${string:start:len} 3 str"123456789" 4 substr${str:3:3} 5 echo $substr 6 7 输出&#xff1…

方格取数(网络流)

题目链接:ヾ(≧∇≦*)ゝ 大致题意:给你一个\(n*m\)的矩阵,可以取任意多个数,但若你取了一个数,那么这个数上下左右的数你就都不能取,问能取到的最大值是多少。 Solution: 首先,我们可以把矩阵上…

mysql创建的数据库都在哪里看_mysql 怎么查看创建的数据库和表

1、 //看当前使用的是哪个数据库 ,如果你还没选择任何数据库,结果是NULL。mysql>select database(); ------------ | DATABASE() | ------------ | menagerie | ------------2、//查看有哪些数据库 mysql> show databases;--------------------| Database …

wordpress 基础文件

需要用到的PHP基础文件有&#xff1a; 404.php404模板 rtl.css 如果网站的阅读方向是自右向左的&#xff0c;会被自动包含进来comments.php 评论模板single.php文章模板。显示单独的一篇文章时被调用&#xff0c;如果模板不存在会使用 index.phpsingle-<post-type>.php自…

ajax请求 apend,jsp如何获取ajax append的数据?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我在网上下了个上传图片的js&#xff0c;我想上传图片的时候还提交一些参数&#xff0c;但是后台用request.getParameter("th");获取出来是nullfunction uploadSubmitHandler () {if (state.fileBatch.length ! 0) {var …

linux 机器格式化_为什么机器人应该为我们格式化代码

linux 机器格式化by Artem Sapegin通过Artem Sapegin 为什么机器人应该为我们格式化代码 (Why robots should format our code for us) I used to think that a personal code style is a good thing for a programmer. It shows you are a mature developer who knows what g…

Pytest高级进阶之Fixture

From: https://www.jianshu.com/p/54b0f4016300 一. fixture介绍 fixture是pytest的一个闪光点&#xff0c;pytest要精通怎么能不学习fixture呢&#xff1f;跟着我一起深入学习fixture吧。其实unittest和nose都支持fixture&#xff0c;但是pytest做得更炫。 fixture是pytest特有…

mysql 慢日志报警_一则MySQL慢日志监控误报的问题分析

之前因为各种原因&#xff0c;有些报警没有引起重视&#xff0c;最近放假马上排除了一些潜在的人为原因&#xff0c;发现数据库的慢日志报警有些奇怪&#xff0c;主要表现是慢日志报警不属实&#xff0c;收到报警的即时通信提醒后&#xff0c;隔一会去数据库里面去排查&#xf…

用css实现自定义虚线边框

开发产品功能的时候ui往往会给出虚线边框的效果图&#xff0c;于是乎&#xff0c;我们往往第一时间想到的是用css里的border&#xff0c;可是border里一般就提供两种效果&#xff0c;dashed或者dotted&#xff0c;ui这时就不满意了&#xff0c;说虚线太密了。废话不多说&#x…

无限复活服务器,绝地求生无限复活模式怎么玩 无限复活新手教程

相信不少的绝地求生玩家们最近都听说了其无限复活模式吧?因此肯定想要知道这种模式究竟该怎么玩&#xff0c;所以下面就来为各位带来此玩法的攻略相关&#xff0c;希望各位在看了如下的内容之后恩呢狗狗了解到新手教程攻略一览。“War”模式的设定以及玩法规则如下&#xff1a…

lua math.random()

math.random([n [,m]]) 用法&#xff1a;1.无参调用&#xff0c;产生[0, 1)之间的浮点随机数。 2.一个参数n&#xff0c;产生[1, n]之间的整数。 3.两个参数&#xff0c;产生[n, m]之间的整数。 math.randomseed(n) 用法&#xff1a;接收一个整数n作为随即序列的种子。 例&…

零基础学习ruby_学习Ruby:从零到英雄

零基础学习ruby“Ruby is simple in appearance, but is very complex inside, just like our human body.” — Matz, creator of the Ruby programming language“ Ruby的外观很简单&#xff0c;但是内部却非常复杂&#xff0c;就像我们的人体一样。” — Matz &#xff0c;R…

windows同时启动多个微信

1、创建mychat.bat文件(文件名任意)&#xff0c;输入以下代码&#xff0c;其中"C:\Program Files (x86)\Tencent\WeChat\"为微信的安装路径。以下示例为同时启动两个微信 start/d "C:\Program Files (x86)\Tencent\WeChat\" Wechat.exe start/d "C:\P…

mysql date time year_YEAR、DATE、TIME、DATETIME和TIMESTAMP详细介绍[MySQL数据类型]

为了方便在数据库中存储日期和时间&#xff0c;MySQL提供了表示日期和时间的数据类型&#xff0c;分别是YEAR、DATE、TIME、DATETIME和TIMESTAMP。下面列举了这些MSL中日期和时间数据类型所对应的字节数、取值范围、日期格式以及零值。从上图中可以看出&#xff0c;每种日期和时…

九度oj 题目1380:lucky number

题目描述&#xff1a;每个人有自己的lucky number&#xff0c;小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话&#xff0c;都是他的lucky number。但是&#xff0c;现在这个序列很大&#xff0c;他无法快速找到所有lucky number。既然这…

安装Tengine

1.安装VMware2.安装CentOS6.53.配置网络a.修改 /etc/sysconfig/network-scripts/ifcfg-eth0配置文件,添加如下内容DEVICEeth0HWADDR00:0C:29:96:01:6BTYPEEthernetUUID41cbd943-024b-4341-ac7a-e4d2142b4938ONBOOTyesNM_CONTROLLEDyesBOOTPROTOnoneIPADDRxxx.xxx.x.xxx#例如:IP…

node seneca_使用Node.js和Seneca编写国际象棋微服务,第2部分

node seneca处理新需求而无需重构 (Handling new requirements without refactoring) Part 1 of this series talked about defining and calling microservices using Seneca. A handful of services were created to return all legal moves of a lone chess piece on a ches…