Oracle
 sql >> Base de données >  >> RDS >> Oracle

comparaison et échange atomiques dans une base de données

Est-ce que PK est la clé primaire ? Alors ce n'est pas un problème, si vous connaissez déjà la clé primaire, il n'y a pas de sport. Si pk est la clé primaire, cela soulève la question évidente comment connaissez-vous le pk de l'item à retirer de la file d'attente...

Le problème est que si vous ne le faites pas connaissez la clé primaire et souhaitez retirer de la file d'attente la prochaine "disponible" (c'est-à-dire statut =y) et la marquer comme retirée de la file d'attente (supprimez-la ou définissez le statut =z).

La bonne façon de procéder consiste à utiliser une seule instruction. Malheureusement, la syntaxe diffère entre Oracle et SQL Server. La syntaxe SQL Server est :

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

Je ne connais pas assez la clause RETURNING d'Oracle pour donner un exemple similaire à celui de OUTPUT de SQL.

D'autres solutions SQL Server nécessitent que les indications de verrouillage sur SELECT (avec UPDLOCK) soient correctes. Dans Oracle, l'avenue préférée est d'utiliser FOR UPDATE, mais cela ne fonctionne pas dans SQL Server car FOR UPDATE doit être utilisé conjointement avec des curseurs dans SQL .

Dans tous les cas, le comportement que vous avez dans le message d'origine est incorrect. Plusieurs sessions peuvent toutes sélectionner la ou les mêmes lignes et même toutes les mettre à jour, renvoyant le ou les mêmes éléments retirés de la file d'attente à plusieurs lecteurs.