Abfrage läuft immer auf Deadlock

14/06/2008 - 21:50 von Pobe | Report spam
Hi

Ich habe eine Transaktion die immer nach 20 bis 30 Minuten auf einen
Deadlock làuft und immer als Opfer ausgewàhlt wird. Dass sie Stored
Procedure so lange làuft ist schon in Ordnung. Ich weiß, dass alle 30
Minuten auf den Tabellen auf denen diese SP aufsetzt ein Update
gemacht wird. Ich denke, dass das der Grund ist. Ich benötige einen
Weg um die Daten die ich abfrage für dieses mal für andere Operationen
(Löschen oder Ändern) sperrt. Anscheinend reicht die normale Abfrage
nicht aus. Also in etwa, dass ich alle Daten die ich benötige sperre,
dann die Berechnungen ausführe und dann wieder alles freigebe.

Wie kann ich das machen?

Vielen Dank

PoBe
 

Lesen sie die antworten

#1 Christoph Ingenhaag
15/06/2008 - 10:36 | Warnen spam
"Pobe" wrote:

Hi

Ich habe eine Transaktion die immer nach 20 bis 30 Minuten auf einen
Deadlock làuft und immer als Opfer ausgewàhlt wird. Dass sie Stored
Procedure so lange làuft ist schon in Ordnung. Ich weiß, dass alle 30
Minuten auf den Tabellen auf denen diese SP aufsetzt ein Update
gemacht wird. Ich denke, dass das der Grund ist. Ich benötige einen
Weg um die Daten die ich abfrage für dieses mal für andere Operationen
(Löschen oder Ändern) sperrt. Anscheinend reicht die normale Abfrage
nicht aus. Also in etwa, dass ich alle Daten die ich benötige sperre,
dann die Berechnungen ausführe und dann wieder alles freigebe.

Wie kann ich das machen?




Hallo Akronym,

dein System scheint ja Optimierungen aller Art mehr als nötig zu haben

Wie dem auch sei,
hiermit kannst du deine gewünschten Sperren erzeugen. Wenn eine Sperre nicht
innerhalb des Timeouts erteilt werden kann (da andere Sperre), dann làufts in
die zu ergànzende Fehlerbehandlung (bei 2000 auf @@error umstellen).

set lock_timeout 10000 --ms

begin tran

begin try

select *
from <<object1>> with (tablockx, holdlock)

select *
from <<object2>> with (tablockx, holdlock)

select *
from <<object3>> with (tablockx, holdlock)

end try

begin catch

if error_number() = 1222
begin
select 'timeout'
end

end catch

commit

set lock_timeout -1

Aber ich würde da besser mal versuchen Grund in das System reinzubringen, da
làßt sich bestimmt sehr viel rausholen...

Vg
Christoph

Ähnliche fragen