MySQL空间锁机制(LOCK和UNLOCK)

mysql中flush tables和flush tables with read lock详解 官方手册中关于Flush tables的介绍, Closes all open tables, forces all tables in use to be closed, and flushes the query cache. FLUSH TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement.其解析就是关闭所有已打开的表对象,同时将查询缓存中的结果清空。就是说Flu 阅读详情

mysql中lock tables与unlock tables(锁表/解锁)使用总结

php mysql lock tables 使用有感

mysql 的 表锁 lock tables 感觉就像一个 封闭的空间

mysql发现 lock tables 命令的时候,会将带有锁标记的表(table) 带入封闭空间,直到 出现 unlock tables 命令 或 线程结束, 才关闭封闭空间。


进入封闭空间时 , 仅仅只有锁标记的表(table) 可以在里面使用,其他表无法使用。


锁标记 分为 read 和 write 下面是 两种 锁的区别

--------------------------------------------------------------------


//如 将 table1 设为read锁, table2 设为write锁, table3 设为read锁

lock tables [table1] read,[table2] write,[table3] read;
----------------------------------------------------------------------


//执行到这里时,进入封闭空间。


1. table1 仅允许[所有人]读,[空间外]如需写、更新要等待[空间退出],[空间内]如需写、更新会引发mysql报错。
2. table2 仅允许[空间内]读写更新,[空间外]如需写、更新要等待[空间退出]。
3. table3 仅允许[所有人]读,[空间外]如需写、更新要等待[空间退出],[空间内]如需写、更新会引发mysql报错。


----------------------------------------------------------------------
//执行到这里时,退出封闭空间,释放所有表锁

unlock tables
----------------------------------------------------------------------

当前线程关闭时,自动退出封闭空间,释放所有表锁,无论有没有执行 unlock tables

上面一堆东西感觉很乱,下面我们看个实例吧。

在某个地方看到有个例子,具体描述类似如下:商店现在某商品只有1件库存,然后A与B在网上进行下订,A与B几乎同时(或许也就差几毫秒,A比B快那么一点点)进行。

很明显是只有A才能成功下单的,B则会收到库存不足的提示,但是作为放置在服务端的那个页面(或者称为脚本程序)我们得怎样去处理这个问题呢?或者我先放出一段代码吧。

 代码如下复制代码

    $sql = "select number from goods where id=1";
    $number = intval( $db->result( $db->query( $sql ), 0 ) );
    if ( $number > 0 ) {
    sleep( 2 );
    $sql = "update goods set number=number-1 where id = 1";
    if ( $db->query( $sql ) ) {
    echo 'Ok!Here you are!';
    } else {
    echo 'Sorry!Something go wrong!Try it again.';
    }
    } else {
    echo 'No more!you are so late!';
    }

这部分代码除了缺少一定注释外都写得没错,当然$db是一个操作数据库的类,我只是将大部分方法封装了,这里的逻辑也是很明显了。

先获取id为1这个东东的库存数,看看是否为0,如果为0就订购不成功了,如果大于0则将库存减1然后提示ok。这确实没有任何错误,逻辑也对。如果请求是一个接一个地产生的,那么什么问题都没有,但当一些并发情况(paperen也不想用这种专业的名词,其实就是上面那个例子的情况,在相差不明显的时间内有多个请求产生)出现时就可能出现一些无厘头的问题了。你想啊,是不是可能存在一种情况,A刚发出请求,脚本处理到update之前B又发出请求,那么现在库存依然还有1,因为A的update还没有执行呢,所以$number不少于0,这次完了,B也下单了,于是库存变成-1了(假设原来只有1件),确实是一个荒谬而且比较搞笑的结果。

出现问题的原因很明显,就是忽略了这种并发情况的考虑,处理下订应该是种队列方式,也就是先来先得,就是说在执行这个下订动作是要排队的,前面的那个先下订然后后者才能下订,当然当后者下订前才再判断库存的数量。那么怎样解决这个问题呢,在程序层面上貌似真的没有方法去解决这个问题(paperen可没想到代码上的解决方案,有思路的可以留个言),所以在此才提到锁表的概念,你想啊,上面出现这个问题的归根于没有控制一个select number的先后顺序(或者可以这么说吧),因为在A执行update之前你又允许B去查询库存,当然结果还是1,至少要等待A更新库存后才允许其他人的任何操作,也就是对goods表进行一个排队操作,对goods表进行锁定。

说到这里,请不要以为锁表有多么高深,其实它就是一条sql

    LOCK TABLE `table` [READ|WRITE]

解锁

    UNLOCK TABLES;

引用专业的描述是

LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。 

如果一个线程获得在一个表上的一个READ锁,该线程和所有其他线程只能从表中读。 如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。

已经是有种队列的味道,对不,所以解决方案很简单嘛,在select前加锁,执行完后面逻辑代码后解锁。或许有没有人会有一个疑问,就是如果万一锁表后线程就断掉了那么是不是就一直锁表了,这个确实是可能存在但是既然你想到了那么数据库的设计人员也一定考虑到了,可以告诉你关于unlock的一些资料:当线程发出另一个 LOCK TABLES,或当与服务器的连接被关闭时,被当前线程锁定的所有表将被自动地解锁。这下放心了吧。

好,看下改进后的代码。

   

 代码如下复制代码
$db->lock( 'goods', 2 );
    $sql = "select number from goods where id=1";
    $number = intval( $db->result( $db->query( $sql ), 0 ) );
    if ( $number > 0 ) {
    sleep( 2 );
    $sql = "update goods set number=number-1 where id = 1";
    if ( $db->query( $sql ) ) {
    echo 'Ok!Here you are!';
    } else {
    echo 'Sorry!Something go wrong!Try it again.';
    }
    } else {
    echo 'No more!you are so late!';
    }
    $db->unlock();

只加了两行代码,不过也不能这么说,因为paperen我修改了自己那个操作数据库的类,加了两个方法lock与unlock,其实这两个方法也很简单。

 

 代码如下复制代码
   /**
    * 锁表
    * @param string $table 表名
    * @param int $type 读锁1还是写锁2
    */
    public function lock( $table, $type = 1 ) {
    $type = ( $type == 1 ) ? 'READ' : 'WRITE';
    $this->query( "LOCK TABLE `$table` $type" );
    }
     
    /**
    * 解锁
    */
    public function unlock() {
    $this->query( "UNLOCK TABLES" );
    }

关于lock自己可以再斟酌一下,因为第二个参数这样弄看上去并不太舒服。嗯哼~那怎测试呢?paperen使用jmeter进行测试结果

关于jmeter可以在http://jakarta.apache.org/site/downloads/downloads_jmeter.cgi 这里下载,在邪恶的人手中可以是一个恐怖的工具在善良的人手中是一个友好的工具。

您需要创建两个线程,其实就是对服务器发出两个请求。

具体配置paperen在此不说,我导出了一个计划文件,大家可以试着打开就能看到paperen是怎测试的了。http://iamlze.cn/demo/locktable/locktable.jmx

保存下来然后导入必需调整一下你本地测试的路径,最后ctrl+R(运行),在线程下查看结果树就有请求的回应信息了。

首先测试不加锁表的情况(就是一开始不加lock与unlock操作的代码)看看两个线程出来的结果。

都是ok~~再看数据库

然后将number改回1,再将lock与unlock,锁表操作加上,再运行。

好吧,数据表就不用看了吧,结果已经很明显了,再前一个请求对表操作完成之前,之后那些请求都要在等待,直到前面请求完成了才能操作,也就是队列的味道。

老实说mysql的事务也需要下点功夫研究一下,paperen关于锁表的了解也就是在查看事务的过程中产生的,在高级的应用过程中这种技术就更加重要,更加严谨的逻辑代码与严谨的数据库管理才能更进一步保证数据的真实与准确性。真是后知后觉

 

参考:https://www.cnblogs.com/ginikeer/p/4349704.html

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架 本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。 阅读详情

相关推荐

别再自己造轮子了!用MONAI Model Zoo里的预训练模型,5分钟搞定医学影像AI项目

本文介绍了如何利用MONAI Model Zoo中的预训练模型快速搭建医学影像AI项目,大幅节省开发时间和计算资源。通过实战案例展示了UNet、DenseNet121等核心模型的应用技巧,帮助临床医生和研究者5分钟内启动高质量医学影像分析,特别适合小样本场景下的病灶分割和分类任务。

weixin_33704234的博客 238

MySql中表锁Lock命令和unlock命令

MySQL LOCK 命令的语法如下 LOCK TABLE table1 locktype, table2 locktype ... 对一个表解锁: UNLOCK TABLE[S] 如: lock table car write; select * from car; unlock table; 解锁命令不需要额外的参数,UNLOCK 将解除该用户所

caomiao2006的专栏 2万+

抖音批量取消关注神器:5行JS代码搞定,告别手动操作(附详细步骤)

本文介绍了一种利用JS脚本在抖音创作者平台批量取消关注的高效方法。通过浏览器开发者工具执行简单的JavaScript代码,即可自动化模拟点击操作,快速清理大量关注列表,告别繁琐的手动操作。文中提供了详细的步骤和核心代码,适合有一定技术基础的用户参考。

weixin_29009971的博客 595

Mysql lock与unlock

lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另外一种是写锁定,用命令lock tables tablename write.下边分别介绍: 1. lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从表中读数据,不能进行任何写操作。 下边我们测试

kunatnet的专栏 600

基于FPGA的 SelectIO IP核 的仿真验证-----( LVDS差分高速传输)

SelectIO IP核 的仿真验证

qq_43618170的博客 1万+

VCS HVP与验证计划planner:数字IC验证环境搭建与收敛实践

在数字IC验证中,VCS 是广泛使用的编译型仿真器,HVP 通常指面向硬件验证平台的高性能编译选项集,用于开启 SystemVerilog 类、随机约束和 NTB 等能力;planner 则指验证计划管理,核心是把功能点与测试用例、覆盖点建立映射。理解 VCS 先编译后仿真的原理,有助于优化增量编译、调试访问和覆盖率采集,提升回归收敛效率。规划驱动让激励不再散落,设计改版时能快速定位受影响用例,交接和覆盖率收敛更有依据。无论是 UVM 环境搭建、编译参数选择,还是验证计划表维护,都需要把工具选项与规划方法结

weixin_42543046的博客 336

mysql中lock tables与unlock tables(锁表/解锁)使用总结

在mysql中锁表与表解锁,我们用到lock与unlock了,今天我来给各位朋友整理一些在使用lock tables与unlock tables过程中的一些经验分享。 php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(table)...

weixin_30684743的博客 420

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 548

MySQL中的LOCK和UNLOCK

MySQL中的LOCK和UNLOCK 今天在学习MySQL的备份的时候,通过源码获得一串代码 LOCK TABLES `fb_user` WRITE; /*!40000 ALTER TABLE `fb_user` DISABLE KEYS */; INSERT INTO `fb_user` VALUES (1,018,'coding','w','dennis'),(2,018,'coding','...

weixin_45958024的博客 1146

【DEIM创新改进】独家下采样创新改进篇 | ECCV 2026 | DEIM 引入FSD-Down频域-空间动态下采样,在下采样过程中保留小目标的高频信息、助力小目标检测、遥感小目标检测有效涨点

🔥本文提出了一种名为FSD-Down的频域-空间动态下采样模块,用于改进DEIM网络模型在小目标检测中的性能。FSD-Down通过小波分解显式保留低频语义和高频细节,结合分组卷积、动态通道权重和可学习缩放因子,自适应强化目标边缘与纹理特征。该模块能有效减轻传统下采样造成的频率混叠和细节丢失,提升对小目标、密集目标和低对比度目标的检测能力。实验表明,FSD-Down计算开销可控,在保持实时性的同时显著提升检测精度,特别是在VisDrone和AITODv2数据集上对小目标的检测性能提升显著。

Ai缝合怪、助力小伙伴高效发论文 82

勇攀数字高峰

摘要:该题目要求在数字地形图中寻找从最低点到最高点的所有严格递增登山路径。采用DFS深度优先搜索结合回溯算法,通过标记已访问位置并检查高度差限制(0<diff≤maxDiff)来遍历所有可能路径。算法首先确定起点(最低点)和终点(最高点),然后进行DFS搜索,每步移动需满足四个方向的合法移动且高度严格递增。最终输出符合条件的路径总数。提供了C++、Java和Python三种实现方案。

面试高手的博客 620

快速解决oracle数据库死锁问题

查看锁表进程 select * from v$session t1, v$locked_object t2 where t1.sid = t2.SESSION_ID 结束对应的进程 alter system kill session 'sid, serial#' SID:会话标识符 SERIAL#:会话序列号。 用于唯一标识会话的对象。 如果会话结束且另一个会话以相同的会话ID开始,则保证...

Lin_Miao_09的博客 663

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 631

MySQL的锁机制

MySQL的锁机制

26857259 1231

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL 锁机制 —— 从入门到入土

本文深入解析MySQL InnoDB锁机制,涵盖锁的分类、实现原理、死锁处理及优化策略。

weixin_72753562的博客 2343

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

MySQL中的锁机制详解

事务的(隔离级别)是由锁来保证的。并发访问数据的情况分为:1.读-读即并发事务相继读取相同的记录,因为没涉及到数据的更改,所以不会有并发安全问题,允许这种情况发生。2.写-写即并发事务对相同记录进行修改,会出现问题,因为任何一种隔离级别都不允许发生脏写,所以多个未提交的事务对同一个记录修改时需要加锁,保证它们是顺序执行的。锁内存中的结构,当事务想对某条数据进行更改时,首先会查看该记录有没有与之关联的锁结构,有的话则等待它的事务被提交,锁被释放;反之没有锁则生成锁结构与该记录继续关联。......

清风 5604

mysql锁表导出_mysql中lock tables与unlock tables(锁表/解锁)使用总结

转载https://www.cnblogs.com/ginikeer/p/4349704.htmlmysql lock tables 使用有感mysql 的 表锁 lock tables 感觉就像一个 封闭的空间mysql发现 lock tables 命令的时候,会将带有锁标记的表(table) 带入封闭空间,直到 出现 unlock tables 命令 或 线程结束, 才关闭封闭空间。进入封闭空...

weixin_32523999的博客 535

mysql锁机制

MyISAM引擎表锁 1、表锁分为表共享锁和表独占写锁 对MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求; 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作; MyISAM表的读操作和写操作之间,以及写操作之间是串行的。 2、表锁实现的方法 LOCK TABLES remind_message READ LOCAL ,remind_message WR...

壮子大壮子 203

MySQL高级部分( 四: 锁机制、SQL优化 )

MySQL高级部分 四: 锁机制、SQL优化 锁机制SQL优化 锁机制 SQL优化

lanleihhh的博客 718

MYSQL----------数据库优化及锁机制详解

MySQL有多种锁机制,用来控制并发访问,保障数据一致性。不同存储引擎的锁实现差异很大,主流的MYISAM和INNODB各有特点。

xx 724

mysql查询缓存加锁_MySQL事务、锁机制、查询缓存

A:automicity/*原子性:整个事务中的所有操作要么全部成功执行,要么全部失败回滚*/C:consistency/*一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态*/I:isolation/*隔离性:一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰*/D:durability/*持久性:事务一旦提交,其所做的修改会永久存入数据库中*...

weixin_28941265的博客 170

MySQL中的锁机制、MyISAM表锁、MyISAM表级锁争用情况、MyISAM并发插入Concurrent Inserts、MyISAM的锁调度

读锁、写锁、乐观锁、悲观锁、行锁、表锁内部锁:在MySQL服务器内部执行的锁,以管理多个会话对表内容的争用。这种类型的锁是内部的,因为它完全由MySQL服务器执行,不涉及其他程序。表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

qq_37432174的博客 541

MySQL锁定状态查看命令

1 show processlist; SHOW PROCESSLIST显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。如果有线程在update或者insert 某个表,此时进程的status为updating

在路上 6172

MySQL中的锁机制:行级锁、表级锁与页级锁

在MySQL数据库中,锁是控制并发访问的重要机制。不同的锁级别可以影响数据库的性能和并发处理能力。MySQL主要支持三种锁级别:行级锁(Row-Level Locks)、表级锁(Table-Level Locks)和页级锁(Page-Level Locks)。本文将详细描述这三种锁的特点及其在实际应用中的影响。

My_wife_QBL的博客 841
上一篇: MySQL运行时锁机制(排他和共享)
下一篇: tcp socket/ unix socket
HideInTime
博客等级 码龄9年 86粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值