2024-01-13 22:01:56.0|分类: mysql|浏览量: 367
Lock wait timeout exceeded: tryrestarting transaction Query: mysql出现死锁并获取锁超时后,会出现上面的错误 排查这个问题思路 1、检查当前数据库连接是否存在长事务或者死锁情况。 2、检查当前数据库连接是否释放了所有被占用的锁。 3、检查当前数据库连接是否在请求一个过度繁忙的资源。
information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。再简单点,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息都保存在information_schema表里面。 innodb_trx 当前运行的所有事务 innodb_locks 当前出现的锁 innodb_lock_waits 锁等待的对应关系 举个自己遇到的例子 A线程开启事务去更新一个表的某个条记录,比如 UPDATE user SET name='张三' where id = 1234; A线程事务运行比较慢,一直没有提交事务。 B线程开启事务去执行其他业务动作,恰好也在更新这条记录,比如: UPDATE user SET age=28 where id = 1234; 这个时候B线程的会报出错误Lock wait timeout exceeded: tryrestarting transaction Query: UPDATE user SET age=28 where id = 1234; lock_wait_timeout的作用? lock_wait_timeout的作用是控制会话的等待锁的时间,从而保证系统的安全和稳定性。其主要作用有以下几点: 1、控制并发访问:在高并发场景下,访问同一个资源的并发时间会相对较长,如果不对会话的等待锁的时间进行控制, 就会导致并发访问时出现大量的等待锁和死锁情况。 2、避免死锁:当不同的会话之间相互等待对方释放锁时,就会出现死锁现象。通过对等待锁时间的限制,可以有效地避免死锁的出现。 3、保证数据一致性:在保证并发访问的同时,也需要保证对数据更新的一致性和可靠性。 lock_wait_timeout的设置可以有效保证数据的一致性。
SHOW VARIABLES LIKE 'lock_wait_timeout'; lock_wait_timeout修改方式? lock_wait_timeout可以通过以下两种方式进行设置: 1、通过系统变量进行设置:可以通过set语句对该变量进行设置,例如: SET lock_wait_timeout = 10; 执行以上语句会将当前会话的lock_wait_timeout值调整为10秒。 2、在配置文件中进行设置:可以在配置文件my.cnf或my.ini中添加以下行: [mysqld] lock_wait_timeout=10 这种方式可以使MySQL服务器在启动时就设置好lock_wait_timeout值,从而保证了全局的设置一致性。 参考文档:https://www.python100.com/html/97994.html |