sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af SQL Server som ressourcelåsemekanisme

Du beskriver grundlæggende en klassisk købaseret arbejdsgang, og du bør overveje at bruge en ægte .

For diskussionens skyld, her er, hvordan du opnår det, du ønsker:

  • krav på specifik ressource:SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK) WHERE key = @key . Blokerer, hvis ressourcen allerede er gjort krav på. Brug lock timeouts til at returnere undtagelsen, hvis ressourcen allerede er gjort krav på. key skal være indekseret og unik.
  • næste tilgængelige ressource:SELECT ... FROM resources WITH (UPDLOCK, ROWLOCK, READPAST) ORDER BY <accessorder> . Du skal definere en ordre ved at udtrykke præference for ressourcer (ældste, højeste prioritet osv.)
  • frigiv en ressource, der er gjort krav på:COMMIT din transaktion.

Kernen i problemet er at bruge de rigtige låsetip, og denne form for problem kræver eksplicitte låsetip at løse. UPDLOCK vil fungere som en 'krav'-lås. ROWLOCK skaber den rigtige granularitet, der forhindrer serveren i at 'optimere' til en sidelås. READPAST giver dig mulighed for at springe over påkrævede ressourcer. Placering af UPDLOCK på rækkerne vil låse rækken og give dig mulighed for at opdatere den senere, men vil forhindre andre operationer, såsom almindelige læseforpligtede SELECT'er, der vil blokere på den låste række. Tanken er dog, at du alligevel vil OPDATERE rækken, hvilket vil placere en uundgåelig X-lås. Hvis du vil holde tabellen mere tilgængelig, kan du bruge applåse i stedet, men er væsentligt sværere at trække korrekt ud. Du skal anmode om en applås på en strengbeskrivelse af ressourcen, såsom nøgleværdien eller en CHECKSUM af nøglen, eller det er %%LOCKRES%% værdi. Applåse giver dig mulighed for at adskille omfanget af 'kravet' fra en transaktion ved at anmode om applåsen i 'session'-omfanget, men derefter skal du frigive kravet manuelt ('transaktions'-omfangede applåse frigives på tidspunktet for commit) . Vær dog opmærksom, der er tusinde måder at skyde dig selv i foden med applåse.



  1. Opret SQL INSERT script med værdier indsamlet fra tabel

  2. CakePHP vil ikke anvende gruppe efter tilstand

  3. ROracle dbWriteTable opretter Oracle TIMESTAMP-kolonner for R DATE-kolonner

  4. Overførsel af databaseforespørgselsresultater til jQuery Sparkline-diagrammer ved hjælp af PHP