【MySQL】MySQL 常用语法之锁表与解锁表
mysql 锁表语句:
Lock锁整张表:
写锁定:
LOCK TABLES products WRITE;
写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.....
读锁定:
LOCK TABLES products READ;
读锁,锁定之后,无论是当前线程还是其他线程均只能读操作,写操作全部被堵塞....
解锁:
UNLOCK TABLES;
行级锁/排他锁 [使用FOR UPDATE]:
表需要是InnoDB引擎;
还需要配合事务,否则没有效果[没有事务的话,应该是锁了执行完该句马上又解锁,看不到效果吧];
BEGIN;//启动事务 SELECT * FROM products WHERE id=1 FOR UPDATE;//锁定某一行 where条件需要主键 COMMIT;//事务提交[或者 ROLLBACK 事务回滚]
在启动事务然后锁定某一行后,在事务提交之前或者事务回滚之前该行会一直处于锁定状态,此时只允许当前线程进行读写操作,其他线程只能进行读操作,其他写操作全部被堵塞....
MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型是不支持的!
补充:(2017-10-30)
Gap锁,区间锁。
1、当表数据id只有100-200,这100条数据
事务1:
select * from u_table where id=50 for update;
事务2:
insert into u_table(id)values(55); #select * from u_table where id=55 for update;//无效,测试结论来看以下结论只对insert有效
此时事务2会等待事务1操作完才能执行。(事务2,id=45也等待, 245没有等待)
结论:当锁行数据不存在时,并且事务1,锁的id(50)小于当前表的区间值时。则id小于现有数据的最小id的事务都会锁定。区间锁定在( -∞,100)
2、数据id依然是100-200,这100条数据
直接给结论:当锁行数据不存在时,并且事务1,锁的id(250)大于当前表的区间值时。则id大于现有数据的最大id的事务都会锁定。区间锁定在( 200,+∞)
3、数据id依然是100-200,300-400,这200条数据
直接给结论:当锁行数据不存在时,并且事务1,锁的id(250)在当前表的某一段区间内时。则id在这段区间内的事务都会锁定。区间锁定在( 200,300)
PS.以前一直认为行锁,不会影响insert,现在看来,锁行的数据不存在时,还是要小心点,不然容易出现死锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义