Mysql 在表已锁定的情况下执行嵌套SQL时,“表未使用锁表锁定”

Mysql 在表已锁定的情况下执行嵌套SQL时,“表未使用锁表锁定”,mysql,Mysql,我试图执行以下sql,由于多个进程之间的同步,我首先锁定了表 lock tables Report write; SELECT id,taskTime,timeout,maxExecutionTimes,currentOwner, tenantID, case when tenantID = 'NoValue' then 1 else 0 end tenantOrder, case when tenantID in (select distinct tenantID from Report

我试图执行以下sql,由于多个进程之间的同步,我首先锁定了表

lock tables Report write;
SELECT id,taskTime,timeout,maxExecutionTimes,currentOwner, tenantID, 
case when tenantID = 'NoValue' then 1 else 0 end tenantOrder, 
case when tenantID in (select distinct tenantID from Report where state = 2) then 1 else 0 end mspInHandling 
FROM Report WHERE state=2 and maxExecutionTimes>executionTimes  
order by tenantOrder desc, mspInHandling limit 1
虽然表已经被锁定,但此sql语句总是给我一个错误,如:table Report未使用锁定表锁定

如果我不锁定表,SQL语句可以很好地运行,我认为这可能与state=2的嵌套select distinct TENATID from报告有关,但无法找到解决方法


有人能帮忙吗?提前感谢。

使用子查询时,需要为子查询表添加别名,并使用相同的别名锁定该表。你能试试这个吗

lock tables Report write, Report as r2 read;
SELECT id,taskTime,timeout,maxExecutionTimes,currentOwner, tenantID, 
case when tenantID = 'NoValue' then 1 else 0 end tenantOrder, 
case when tenantID in (select distinct tenantID from Report as r2 where state = 2) then 1 else 0 end mspInHandling 
FROM Report WHERE state=2 and maxExecutionTimes>executionTimes  
order by tenantOrder desc, mspInHandling limit 1
在上面的sql中,我将表报表锁定为r2读取,并将子查询报表别名为r2


谢谢你的帮助。我需要一个写锁来提供进程之间的同步。看起来在mysql中,只要锁定一个表进行写入,就不能从其他表读取,而在这个sql语句中,嵌套查询可能会导致一个临时表,如果没有锁定,则会导致错误。我试过锁表报表读取,报表为报表1写入;建议在不开始工作的情况下,这是否意味着在表锁定后无法运行此类语句?@KeanLiu啊,是的,您的权利它创建了一个临时表,需要使用您用来锁定的表别名锁定该临时表。我认为子查询表可能需要用write锁定。我现在更新答案