2013-02-23 1 views
1

У меня есть некоторые проблемы со следующим утверждением, есть ли у кого-нибудь идеи?Определите тупик с помощью этого оператора 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

+0

Вы пробовали это с подмножеством 40k? Возможно, это так долго, что сценарий считает, что он имеет мертвый замок. – PCoelho

+1

Попробуйте сначала установить блокировку записи на стол. –

+0

Спасибо за комментарии, PCoelho прав, операция заняла так много времени, чтобы другой поток был отключен и получил ту тупиковую ошибку. Проблема исчезает после изменения инструкции SQL ~~ – kai

ответ

2

Вы можете попробовать это так:

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; 

Это может предотвратить циклическую зависимость между двумя запросами.

Удачи вам!

+0

Спасибо mrhobo, она становится быстрее. – kai

Смежные вопросы