[MSSQL] Record lock - Wachten op record release mogelijk?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 321X
  • Registratie: April 2009
  • Laatst online: 01-01-2023
Hi,

Een vraagje over MSSQL. Aangezien ik niet weet of dit mogelijk is, misschien iemand hier wel.

Het gaat om het volgende:
Ik heb een query die ik uitvoer via ADO (VBScript). Het record wordt pessimistisch gelockt omdat het in de tussentijd niet gewijzigd mag worden.

Als er tussen het aanmaken van de recordset en het committen hiervan zo'n zelfde actie wordt uitgevoerd dan is er iemand de deadlock-victim.

Is het op de een of andere manier mogelijk (wellicht instelling in MSSQL) om de tweede aanvraag te laten wachten ipv dood te laten gaan?

Het betreft overigens het ophalen van een sequence nummer uit een tabel, deze opslaan in een variabele, ophogen (kan evt in update query) en weer wegschrijven.

321X


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Een deadlock kan niet opgelost worden door te wachten. Beide connecties wachten op elkaar immers, dat is het principe van een deadlock.

Waarom gebruik je niet trouwens een Identity om een nieuw volgnummer aan te maken?

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • 321X
  • Registratie: April 2009
  • Laatst online: 01-01-2023
P_de_B schreef op maandag 16 augustus 2010 @ 10:29:Waarom gebruik je niet trouwens een Identity om een nieuw volgnummer aan te maken?
Omdat het datamodel stiekem ruk is. Ik wist dat die vraag zou komen!

Er moet een unieke key zijn over twee verschillende tabellen. De data wordt vervolgens met een Union uitgelezen... ja ja... O-)

321X


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Kun je dan niet beter een insert in tabel 1 doen, de identity uitvragen en daarmee de insert in tabel 2 doen? Transactie er omheen en gaan zou ik zeggen.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • 321X
  • Registratie: April 2009
  • Laatst online: 01-01-2023
Het is niet per definitie zo dat eerst tabel 1 wordt voorzien en daarna tabel 2.

Er is een sequence tabel die het nummertje bijhoudt, deze ophoogt en dan aan tabel 1 of tabel 2 geeft.

Row Level Versioning staat aan in MSSQL en het geheel begeeft zich al in een transactie.

[ Voor 19% gewijzigd door 321X op 16-08-2010 10:44 ]

321X


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Tja, dan moet je in de client afvangen of er een deadlock optreedt, dat is een speciale errorcode dus die kun je uitvragen, en opnieuw de code uitvoeren van de deadlock victim.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • 321X
  • Registratie: April 2009
  • Laatst online: 01-01-2023
Ja precies, dat dacht ik al... Ik had gehoopt voor een nettere oplossing.

321X


Acties:
  • 0 Henk 'm!

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
De nette oplossing is, hoe lullig het ook klinkt, je programma zo schrijven dat het in principe niet kán gebeuren. Als dat nu niet meer lukt is dit geen vieze hack imho.

Oops! Google Chrome could not find www.rijks%20museum.nl


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-09 10:54

Janoz

Moderator Devschuur®

!litemod

Kun je geen optimistic locking gebruiken en vervolgens bij het detecteren van een race probleem opnieuw een volgnummer opvragen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1