我的 laravel 作业经常出现 超出锁定等待超时错误
我无法追踪,INSERT语句怎么可能得不到LOCK
根据我的理解,将在新行中进行INSERT,因此不存在等待锁定
的问题MySQL用作数据库
请建议如何处理,或者根本原因是什么?
日志:
{"message":"SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting
transaction (SQL: insert into `jobs` (`queue`, `attempts`, `reserved_at`, `available_at`,
`created_at`, `payload`) values (default, 0, , 1599989867, 1599989867,
{\"displayName\":\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusinessReward
Job\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"timeout\":nu
ll,\"timeoutAt\":null,\"data\":
{\"commandName\":\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusinessReward
Job\",\"command\":\"O:68:\\\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusi
nessRewardJob\\\":8:{s:7:\\\"\\u0000*\\u0000data\\\";a:4:
{s:7:\\\"user_id\\\";s:10:\\\"1000210290\\\";s:10:\\\"event_type\\\";s:20:\\\"KHATA_BUSINESS_ADD
ED\\\";s:10:\\\"user_count\\\";i:1;s:12:\\\"global_count\\\";i:890;}s:6:\\\"\\u0000*\\u0000job\\
";N;s:10:\\\"connection\\\";N;s:5:\\\"queue\\\";N;s:15:\\\"chainConnection\\\";N;s:10:\\\"chainQ
ueue\\\";N;s:5:\\\"delay\\\";N;s:7:\\\"chained\\\";a:0:
{}}\"},\"NewRelicID\":\"VgUGUlBTChADVVFQAAEEX1M=\",\"NewRelicTransaction\":\"PxQDUgNUCFcABlkDBVB
UV1UBFB8EBw8RVU4aVgtdAwJXVVtZUFNSAVUHB0NKQQ1QCF1WUlYFFTs=\"}))",
"context":{"exception":{"class":"Illuminate\\Database\\QueryException","message":"SQLSTATE[HY000]:
General error: 1205 Lock wait timeout exceeded; try restarting transaction (SQL: insert into `jobs` (`queue`, `attempts`, `reserved_at`, `available_at`, `created_at`, `payload`) values (default, 0, , 1599989867, 1599989867,
{\"displayName\":\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusinessReward
Job\",\"job\":\"Illuminate\\\\Queue\\\\CallQueuedHandler@call\",\"maxTries\":null,\"timeout\":nu
ll,\"timeoutAt\":null,\"data\":
{\"commandName\":\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusinessReward
Job\",\"command\":\"O:68:\\\"Modules\\\\RewardAnalyzer\\\\Jobs\\\\RewardEvents\\\\KhataFirstBusi
nessRewardJob\\\":8:{s:7:\\\"\\u0000*\\u0000data\\\";a:4:
{s:7:\\\"user_id\\\";s:10:\\\"1000210290\\\";s:10:\\\"event_type\\\";s:20:\\\"KHATA_BUSINESS_ADD
ED\\\";s:10:\\\"user_count\\\";i:1;s:12:\\\"global_count\\\";i:890;}s:6:\\\"\\u0000*\\u0000job\\
\";N;s:10:\\\"connection\\\";N;s:5:\\\"queue\\\";N;s:15:\\\"chainConnection\\\";N;s:10:\\\"chain
Queue\\\";N;s:5:\\\"delay\\\";N;s:7:\\\"chained\\\";a:0:
{}}\"},\"NewRelicID\":\"VgUGUlBTChADVVFQAAEEX1M=\",\"NewRelicTransaction\":\"PxQDUgNUCFcABlkDBVB
UV1UBFB8EBw8RVU4aVgtdAwJXVVtZUFNSAVUHB0NKQQ1QCF1WUlYFFTs=\"}))","code":0,"file":"/var/www/api/ve
ndor/laravel/framework/src/Illuminate/Database/Connection.php:664","previous":
{"class":"PDOException","message":"SQLSTATE[HY000]: General error: 1205 Lock wait timeout
exceeded; try restarting
transaction","code":0,"file":"/var/www/api/vendor/laravel/framework/src/Illuminate/Database/Conn
ection.php:458"}}},"level":400,"level_name":"ERROR","channel":"production","datetime":
{"date":"2020-09-13 15:08:38.660818","timezone_type":3,"timezone":"Asia/Kolkata"},"extra":[]}
您正在使用交易;自动提交不会禁用事务,它只是使它们在语句末尾自动提交。
发生的情况是,某些线程在某些记录上持有记录锁的时间太长,并且您的线程正在超时。
如果您使用 MySQL,您可以在
中查看状态SHOW ENGINE INNODB STATUS
或者
您应该强制解锁 MySQL 中锁定的表,但这很危险,我只在您需要快速修复时推荐它
如何做到这一点?
进入MySQL
mysql -u your_user -p
查看锁定表列表
mysql> show open tables where in_use>0;
查看当前进程列表,其中一个正在锁定您的表
mysql> show processlist;
终止这些进程之一
mysql> kill <put_process_id_here>;
您还可以在这里找到这个答案:获取“超过锁定等待超时;尝试重新启动交易”即使我没有使用交易
我也面临同样的问题。我正在运行 PHP 代码,向数据库发出 SELECT 和 INSERT 请求。该错误仅在 INSERT 查询时抛出。
发生问题是因为我在同一台计算机上也有一个 MySQL Workbench 打开连接。虽然,我没有运行任何可能导致此错误的查询,但 Workbench 连接以某种方式锁定了表并导致 PHP 连接中的 INSERT 查询中出现此错误。
关闭 Workbench 数据库连接解决了问题。
但是,即使您不使用 Workbench,也可以运行
SHOW processlist;
命令,该命令将列出正在运行的 MySQL 进程。带有 Command=Sleep
的连接处于睡眠开放状态。尝试通过运行 KILL <process Id>;
来关闭这些连接
基本上,会话持有表锁,因此您需要找到并终止持有您正在使用的表锁的会话。
如何解决尝试更新产品时出现的此错误?
SQLSTATE[HY000]:一般错误:1205 超出锁定等待超时;尝试重新启动事务,查询为:INSERT INTO
catalog_product_entity_varchar
(attribute_id
,store_id
,entity_id
,value
) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE attribute_id
= VALUES() attribute_id
), store_id
= 值(store_id
), entity_id
= 值(entity_id
), value
= 值(value
)
问候