mysql锁总结:
文章参考自下面这个博主文章,我这只是一篇总结而已!!!:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.youkuaiyun.com/qq_39736597/article/details/113247788
总结:
MyISAM引擎
读锁
lock table 表名 read;
写锁
lock table 表名 write;
解锁锁
unlock tables;
查看表锁情况
show status like 'Table_locks%';
名称 | 含义 |
---|---|
Table_locks_immediate | 能够立即获得表级锁的次数,每立即获取锁,值加1 |
Table_locks_waited | 不能立即获取表级锁而需要等待的次数,每等待一次,该值加1,此值高说明存在着较为严重的表级锁争用 |
1)对MyISAM 表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
2)对MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作;
3)对MyISAM的表进行加锁的当前账号,必须处理当前表,不能处理别的表,相当于买了火车票必须得支付这种
InnoDB 引擎
1)对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁;
可以通过以下语句显示给记录集加共享锁或排他锁 。
共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
排他锁(X) :SELECT * FROM table_name WHERE ... FOR UPDATE
2)无索引行锁升级为表锁
3)间隙锁
当我们用范围条件,而不是使用相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据进行加锁;
说明:比如我们要查找id<10的记录,此时数据库中,id的值分别为1,2,3,4,6,9,此时的5,7,8就都是间隙,innoDB会对1-10的行都会加锁。
3)查看行锁状态
show status like 'innodb_row_lock%';
名称 | 含义 |
---|---|
Innodb_row_lock_current_waits | 当前正在等待锁定的数量 |
Innodb_row_lock_time | 从系统启动到现在锁定总时间长度 |
Innodb_row_lock_time_avg | 每次等待所花平均时长 |
Innodb_row_lock_time_max | 从系统启动到现在等待最长的一次所花的时间 |
Innodb_row_lock_waits | 系统启动后到现在总共等待的次数 |
Innodb_row_lock_current_waits | 当前正在等待锁定的数量 |
意向锁
意向锁就是其中的一种表锁。
意向锁是一种不与行级锁冲突表级锁
意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享 / 排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。
具体参考链接:
意向锁参考