У меня есть некоторые проблемы со следующим утверждением, есть ли у кого-нибудь идеи?Определите тупик с помощью этого оператора SQL?
Любые комментарии оцениваются !!
UPDATE tableTx
SET tableTx.ResultCode = 0
WHERE tableTx.id in (SELECT tableTxInfo.id
FROM tableTxInfo
WHERE tableTxInfo.messageId = 'john-to-bob'
and tableTx.ResultCode != 1)
id
из tableTx
и tableTxInfo
то же самое (он используется в качестве INTEGER PRIMARY KEY
) Для новой транзакции, новая запись будет создана как для tableTx
и tableTxInfo
с тем же идентификатором.
У меня около 40000 записей с messageId = "john-to-bob"
.
Когда я попытался выполнить вышеуказанное заявление SQL из двух разных потоков, один висит довольно долго, а другой поток просто получить ответ:
сделка была обнаружена мертвой точки, откат транзакции.
Я не совсем знаком с концепцией SQL и базой данных. Есть ли способ предотвратить такую ошибку?
моя база данных IBM soliddb
Вы пробовали это с подмножеством 40k? Возможно, это так долго, что сценарий считает, что он имеет мертвый замок. – PCoelho
Попробуйте сначала установить блокировку записи на стол. –
Спасибо за комментарии, PCoelho прав, операция заняла так много времени, чтобы другой поток был отключен и получил ту тупиковую ошибку. Проблема исчезает после изменения инструкции SQL ~~ – kai