MySql锁机制
1.行级共享锁加锁以后其他的也可加锁,行级排它锁加锁以后其他的不能再加锁
2.两种锁锁定以后其他人都只能查询,不能修改和删除。
3.表级锁锁定以后,当前窗口只能查询当前表;其他窗口可查询,但不能修改删除,也不能再加锁
行级共享锁
简称S锁,锁定数据之后,可以查询,但是不能修改删除。加共享锁可以使用select ... lock in share mode语句
查询锁等待超时时间 select @@Innodb_lock_wait_timeout; A事务 #给depno=40的数据加共享锁 select * from dept where deptno=40 lock in share mode ; B事务select * from dept where deptno=40;#成功 delete from dept where deptno=40;#失败 select * from dept where deptno=40 lock in share mode;#成功
行级排它锁
简称X锁,锁定之后,其他事务可以读,不能修改删除,并且不能加共享锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句
查询锁等待超时时间 select @@Innodb_lock_wait_timeout; A事务 #给deptno=40的数据加排他锁 select * from dept where deptno=40 for update ; B事务 select * from dept where deptno=40;#成功 delete from dept where deptno=40;#失败 select * from dept where deptno=40 lock in share mode;#失败
表级锁
对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁。
- 第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。
- 第二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销
A事务 lock tables dept read ; select * from dept;#成功 select * from emp;#失败 select * from dept where dpton=10 for update#失败,不能加锁 unlock tables ; B事务: select * from dept where deptno=40;#成功 delete from dept where deptno=40;#失败 select * from dept where dpton=10 for update#失败,不能加锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?