本文主要是介绍验证mysql的InnoDB引擎的行锁和表锁,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
基础知识
set autocommit=0; # 关闭自动提交
commit; 提交事务
for UPDATE 手工加锁
实验验证
1. innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.
如下图所示 ROLE_NAME 这个字段没有索引,开启事务后,执行了查询语句,没有提交事务,锁住全表,导致第二条更新语句无法执行,当我commit以后,第二条语句立马执行成功,验证没有索引的情况下锁住全表
当给ROLE_NAME加上索引后,查询ROLE_NAME="Redis监控员"的人员,更新ROLE_NAME=“系统管理员” 没有任何影响,查询语句只会锁住对应索引那几个对应的数据,验证有索引的场景下只会锁住对应的行
查询某条记录死锁以及解决办法
# 执行查看 innodb 事务
select * from information_schema.INNODB_TRX;
# 干掉线程
kill 进程号
查询是否表被锁定
show OPEN TABLES where In_use > 0;
SHOW OPEN TABLES列举在表缓存中当前被打开的非TEMPORARY表。
SHOW OPEN TABLES会返回以下字段:
Database
含有该表的数据库。
Table
表名称。
In_use
表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。
Name_locked
表名称是否被锁定。名称锁定用于取消表或对表进行重命名等操作。
查询进程的信息
show full processlist ```
查看autocommit模式 Value的值为ON,表示autocommit开启。OFF表示autocommit关闭。
show variables like 'autocommit'
查看InnoDB事务在放弃前等待行锁的时间 innodb_lock_wait_timeout默认值为50秒。当有试图访问被另一行锁定的行的事务InnoDB事务在发出以下错误:`ERROR
1205 (HY000): Lock wait timeout exceeded; try restarting transaction`
如果等待时间太长可以调整修改此配置值: ```show variables like
‘innodb_lock_wait_timeout’; SET GLOBAL innodb_lock_wait_timeout=10;
查询innodb引擎状态
show engine innodb status
这篇关于验证mysql的InnoDB引擎的行锁和表锁的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!