Ich habe wirklich Probleme mit einer Abfrage in meiner ColdFusion-Anwendung (MS SQL 2008). Ich erhalte DB Deadlock Fehler bei dieser Transaktion:TSQL SELECT dann UPDATE in einer Transaktion, dann 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, ich habe eine Tabelle (Tabelle 1), die eine große Schlange von sind Elemente darstellt. Benutzer "checken" Gegenstände aus, um ihnen eine Punktzahl zu geben. Nur ein Benutzer kann einen Artikel auf einmal auschecken lassen. Ich muss für einen bestimmten Benutzer einen Block mit 20 Elementen gleichzeitig anfordern. Diese Elemente können nicht bereits ausgecheckt werden, und der Benutzer kann sie nicht schon vorher eingekerbt haben (daher ist die lock_field IS NULL- und NOT EXISTS-Anweisung in SELECT). Sobald ich die Liste von 20 item_ids bestimmt habe, muss ich die Queue-Tabelle aktualisieren, um sie als gesperrt zu markieren, so dass niemand sie gleichzeitig auscheckt. Ich muss auch die Liste der Item_ids zurückgeben.
Ich dachte, es könnte besser funktionieren, wenn ich dies von einer ctransaction zu einem gespeicherten proc auf der SQL-Server-Seite verschoben. Ich bin nur nicht sicher, ob die ctransaction-Sperrung irgendwie eingreift. Ich bin kein TSQL-Guru, also würde etwas Hilfe geschätzt werden.
Haben Sie eine '', um Ihre UPDATE-Operation zu schützen? Auf diese Weise sollten alle Nebenläufigkeitsprobleme verschwinden. –
Tomalak
Das Update ist Teil der Transaktion. Ich bin mir nicht sicher, ob ein cflock benötigt wird, oder? –
Eine CFTRANSTRAKTION setzt nur jede SQL-Anweisung zurück, die ausgegeben wird, sobald ein Fehler auftritt. Es sperrt diesen Codeabschnitt nicht. – Tomalak