Я работаю с многопоточным консольным приложением, в котором каждый поток в основном пытается получить строку TOP 1 «Файл» с соблюдением определенных критериев и блокирует ее (есть столбец LockID, который заполняется, когда это происходит, чтобы следующий поток выбирает следующую доступную `` разблокированную '' строку `` Файл '')
Ставим монитор на БД SQL Server и каждый раз тупик происходит на 2 запросах.
SELECT TOP 1 F.Id, F.ContentTypeId, F.ManufacturerId, F.DocumentTypeId, F.Name, F.Description, F.VersionId, F.LastChangedVersionOn, F.ReferenceCount, F.LastChangedReferencesOn, F.LastChangedImageOn, F.ImageSize, F.IsStale, F.InvalidFile, CT.Id, CT.Name, CT.MimeType, CT.IsMimeAttachment, CT.Extensions, CT.CanTrackVersions, CT.UseRemoteSource, CT.FullTextFilter, CT.ContentHandler, V.Id, V.Size, V.Hash, V.Title, DT.Id, DT.Code, DT.Ordinal, DT.Name, DT.PluralName, DT.UrlPart
FROM Docs.Files F
INNER JOIN Docs.ContentTypes CT ON CT.Id = F.ContentTypeId
LEFT JOIN Docs.Versions V ON V.Id = F.VersionId
LEFT JOIN Docs.DocumentTypes DT ON DT.Id = F.DocumentTypeId
WHERE (F.LockId IS NULL OR F.LockedOn < DATEADD(hh,-1,GETUTCDATE()))
AND F.IsStale = 1 AND F.InvalidFile = 0
А ТАКЖЕ
(@Id int)UPDATE Docs.Files
SET LastChangedImageOn = GETUTCDATE(), ImageSize = (
SELECT DATALENGTH(FileImage)
FROM Docs.FileImages
WHERE FileId = @Id)
WHERE Id = @Id;
SELECT TOP 1 LastChangedImageOn FROM Docs.Files WHERE Id = @Id
Первый запрос выполняется, когда создается новый поток, и мы пытаемся получить новую строку «Файл».
Второй запрос выполняется, когда поток (может быть ранее созданным) почти завершил обработку записи «Файл». Используемые транзакции в этом запросе. Уровень изоляции был «ReadCommitted». Я почти уверен, что оба запроса не пытаются получить доступ к одному и тому же «FileID», потому что два потока впоследствии никогда не будут обрабатывать один и тот же «FileID». Я ужасно не понимаю, как я могу диагностировать эту проблему. Что могло вызвать взаимоблокировку между этими двумя запросами? Я был бы очень признателен, если бы кто-нибудь мог направить меня в правильном направлении. Заранее большое спасибо :)