sql >> Databasteknik >  >> RDS >> Oracle

atomic jämföra och byta i en databas

Är PK den primära nyckeln? Då är detta ett icke-problem, om du redan känner till den primära nyckeln finns det ingen sport. Om pk är den primära nyckeln, då väcker detta den uppenbara frågan hur vet du pk för objektet som ska ställas i kö...

Problemet är om du inte gör det känner till primärnyckeln och vill ställa nästa "tillgängliga" i kö (dvs. status =y) och markera den som ur kö (ta bort den eller ange status =z).

Det korrekta sättet att göra detta är att använda ett enda uttalande. Syntaxen skiljer sig tyvärr mellan Oracle och SQL Server. SQL Server-syntaxen är:

update top (1) [<table>]
set status = z 
output DELETED.*
where  status = y;

Jag är inte tillräckligt bekant med Oracles RETURNING-klausul för att ge ett exempel som liknar SQLs OUTPUT.

Andra SQL Server-lösningar kräver låstips på SELECT (med UPDLOCK) för att vara korrekta. I Oracle är den föredragna vägen att använda FOR UPDATE, men det fungerar inte i SQL Server eftersom FOR UPDATE ska användas tillsammans med markörer i SQL .

Hur som helst är beteendet du har i det ursprungliga inlägget felaktigt. Flera sessioner kan alla välja samma rad(er) och till och med alla uppdatera den, vilket returnerar samma urköade objekt(er) till flera läsare.



  1. Säkerhetsstrategier inom datamodellering. Del 3

  2. ändra storleken på kolumnen i tabellen som innehåller data

  3. Det går inte att ändra kolumn som används i en främmande nyckel-begränsning

  4. MySQL - length() vs char_length()