2010-10-15 5 views
6

Dans Oracle, je peux choisir le top 1 message dans une table triée avecSélectionnez top N avec « pour sauter mise à jour verrouillé » dans Oracle

select messageid from(
    select 
     messageid, 
     RANK() over (order by messageid asc) as msg_rank 
    from messages 
) where msg_rank=1; 

Et comme je l'ai découvert dans un previous question je peux sélectionner une ligne exclusivement avec

select * from messages where rownum < 2 for update skip locked; 

Cependant, je ne peux pas fusionner ces deux concepts

select messageid from(
    select 
     messageid, 
     RANK() over (order by messageid asc) as msg_rank 
    from messages 
) where msg_rank=1 for update skip locked; 

-- results in error 
-- ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc. 

Comment puis-je choisir e Le top N avec verrouillage readpast?

+0

Je pense que ce blog a quelques réflexions pertinentes: http://markjbobak.wordpress.com/2010/04/06/unintended-consequences/ –

Répondre

2

Est-ce que cela fonctionnera?

select messageid from messages 
    where messageid in (
     select messageid from(
     select 
      messageid, 
      RANK() over (order by messageid asc) as msg_rank 
      from messages 
     ) where msg_rank=1 
    ) 
    for update skip locked; 
+0

Si cela se fait en deux étapes, ne sont pas l'introduction d'un I condition de course potentielle? Je suis votre logique, mais j'ai du mal à croire qu'Oracle ne puisse pas faire ce que SQL Server peut faire. – Synesso

+0

Cette requête a été exécutée correctement. Je vais continuer à tester que le verrouillage fonctionne comme prévu, mais il semble bon d'y aller. Merci! – Synesso

+0

Eh bien, la sémantique de skip locked est probablement un peu difficile dans ce cas, même sur SQL Server. Je m'attendrais à ce que la requête ci-dessus trouve d'abord les N premiers messages, puis saute parmi eux (de sorte que vous pourriez vous retrouver avec moins de N enregistrements). Et je ne pense pas qu'il y ait un moyen de contourner cela en général (à moins de verrouiller toute la table). – Thilo

Questions connexes