mysql数据库锁
mysql数据库引擎不同实现数据库锁的机制也不同。本文只针对innodb引擎,工作中的常用的共享锁(S)和排他锁(X)
-
共享锁:可存在多个,多个事务可同时持有,与排他锁互斥。
-
排他锁:同一资源只存在一个,多个事务同时申请须排队等待。
基本概念与操作
- 基本概念
1. s锁等级小于x锁,低级别锁升级高级别,需要重新申请,锁释放依赖事务提交。
2. innodb行锁依赖列索引,如果没有索引,会升级表锁(涉及行锁,尽量使用索引,避免锁表)。
3. 5.0.1后mysql版本,自增序列索引不会锁表,之前版本会锁表。属于mysql优化,所以不需要关注并发插入自增序列会锁事务的问题。
4. mysql锁等待时常默认50秒,可以通过缩短时长来提高并发(根据业务来定)。
5. mysql有默认死锁检查机会,存在死锁,会主动关闭小事务来保证事务正常提交。可以通过命令查看死锁日志。
- 基本操作
-- 自动提交
show variables like "autocommit";
set autocommit = off;
-- 锁等待时常
show variables like "Innodb_lock_wait_timeout";
set Innodb_lock_wait_timeout = 500;
-- 死锁检查
show variables like "in