mysqlinnodb的行锁举例分析

这篇文章主要讲解了“MySQL innodb的行锁举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql innodb的行锁举例分析”吧!

目前创新互联已为超过千家的企业提供了网站建设、域名、网络空间、网站托管、企业网站设计、绿园网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

真正决定是否执行要上锁的行不是取出来的行,而是扫描的行。
而是否最索引来扫描记录,则跟具体的执行计划有关系。
所以在分析锁的问题,一定不要忘记看执行计划.
会话1: 由于name是varchar类型,存在隐式转换,所以扫描了所有的记录,因而对所有的记录上锁了
root@sakila 10:33:04>explain select * from tab_no_index where name=1 for update;
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | tab_no_index | ALL  | name          | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

root@sakila 10:34:30>select * from tab_no_index where name=1 for update;
+------+------+
| id   | name |
+------+------+
|    1 | 1    |
+------+------+
1 row in set (0.00 sec)

会话2: 即使更新的记录和回话1选出来的记录不一样,但是由于该记录被第一个会话扫描过,被加锁了,所以也不能上更新锁
root@sakila 10:34:35>select * from tab_no_index where name='4' for update;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

感谢各位的阅读,以上就是“mysql innodb的行锁举例分析”的内容了,经过本文的学习后,相信大家对mysql innodb的行锁举例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


文章名称:mysqlinnodb的行锁举例分析
文章起源:http://pwwzsj.com/article/jhidds.html