首先 1 个线程从表中选择大量数据。
然后,在 SELECT 查询尚未完成之前,另一个线程从该表中删除数据。
它会导致 SELECT 查询失败,错误为 errorCode=1205 sqlState=40001 并显示发生死锁的消息。
我认为第二个事务必须等到第一个事务完成,或者第一个事务必须返回数据而没有第二个事务所做的更改。我怎样才能避免这种情况?
我无法更改交易的顺序或以某种方式控制它们(应用程序的用户很多,他们可以随时以任何顺序做任何他们想做的事情)。为什么会这样?
查询看起来是这样的(我稍微混淆了它们):
SELECT distinct P.pID, (LastNAME+' '+FirstName+' '+SurName) as NAME, 'person' as Type, CA.OrgName, PC.personemail as Email
FROM Persons P
INNER JOIN WORK PW ON (P.mainwork = PW.pwId)
INNER JOIN CONTACT PC ON (PC.pID = P.pID)
LEFT OUTER JOIN ORG CA ON (CA.orgId = PW.orgId)
WHERE (P.Status = ?)
和
DELETE FROM persons WHERE id = 1234