У меня действительно возникает проблема с запросом в моем приложении ColdFusion (с поддержкой MS SQL 2008). Я получаю ошибку DB тупикового по данной сделке:TSQL SELECT, затем UPDATE в одной транзакции, затем верните SELECT
<code>
<cftransaction>
<cfquery name="selectQuery">
SELECT TOP 20 item_id, field2, field3
FROM Table1
WHERE subject_id = #subject_ID# AND lock_field IS NULL AND
NOT EXISTS (SELECT * FROM Table2 WHERE Table2.user_ID = #user_ID# Table1.item_id = Table2.item_id)
</cfquery>
<cfquery name="updateQuery">
UPDATE Table1
SET lock_field = 1, locked_by = #user_ID#
WHERE Table1.item_id IN (#ValueList(selectQuery.item_id#)
</cfquery>
</cftransaction>
</code>
Bascially, у меня есть таблица (Table1), который представляет собой большую очередь элементов ожидания. Пользователи «проверяют» предметы, чтобы дать им оценку. Только один пользователь может одновременно проверять элемент. Мне нужно запросить блок из 20 предметов за раз для данного пользователя. Эти элементы уже не могут быть проверены, и пользователь не может их уже забить (до этого в команде SELECT указывалось оператор lock_field IS NULL и NOT EXISTS). Как только я определил список из 20 item_ids, мне нужно затем обновить таблицу очередей, чтобы пометить их как заблокированные, чтобы никто другой не проверял их одновременно. Мне также нужно вернуть этот список item_ids.
Я думал, что это может сработать лучше, если я переместил это из cftransaction в сохраненный proc на стороне SQL Server. Я просто не уверен, что блокировка блокировки каким-то образом вмешивается. Я не гуру TSQL, поэтому некоторые из них будут оценены.
У вас есть '' на месте, чтобы защитить свою операцию UPDATE? Таким образом, все проблемы параллелизма должны исчезнуть. –
Tomalak
Обновление является частью cftransaction. Я не уверен, что нужен cflock, нет? –
Cftransaction просто отбрасывает каждый SQL-запрос, выпущенный внутри него, как только возникает ошибка. Он не блокирует этот раздел кода. – Tomalak