Oracle select for update comportement

Le problème que nous essayons de résoudre ressemble à ceci.

  • Nous avons une table avec plein de lignes qui représentent les cartes. L'objectif de la réservation opération consiste à attribuer une carte à un client
  • Une carte ne peut pas appartenir à plusieurs de nos clients
  • Après un certain temps (si il n'est pas acheté) une carte doit être retournée à la piscine de disponible resurces
  • Réservation peut être effectuée par de nombreux clients en même temps
  • Nous utilisons la base de données Oracle pour le stockage des données, de sorte que la solution est de travailler au moins sur Oracle 11

Notre solution est d'attribuer un statut à la carte, et de les stocker de la date de réservation. Lors de la réservation d'une carte de nous faire à l'aide de "select for update". La requête recherche les cartes disponibles et pour les cartes qui ont été réservés depuis longtemps.

Cependant notre requête ne fonctionne pas comme prévu.

J'ai préparé simplifiée de la situation pour expliquer le problème.
Nous avons un card_numbers table, plein de données - toutes les lignes non nulles les numéros d'identification.
Maintenant, nous allons essayer de verrouiller certains d'entre eux.

-- first, in session 1
set autocommit off;

select id from card_numbers  
where id is not null  
and rownum <= 1  
for update skip locked;

Nous ne commettons pas la transaction ici, la ligne doit être verrouillé.

-- later, in session 2
set autocommit off;

select id from card_numbers  
where id is not null  
and rownum <= 1  
for update skip locked;

Le comportement attendu est que dans les deux séances, nous n'obtenir qu'un seul, l'autre ligne qui satisfait les conditions de la requête.

Toutefois, il ne fonctionne pas de cette façon. Selon que nous utilisons à ignorer "verrouillé" partie de la requête ou non - les changements de comportements:

  • sans ignorer "verrouillé" - deuxième session est bloquée en attente pour l'opération commit ou rollback lors de la première session
  • avec "skip verrouillé" - deuxième requête est immédiatement retournée aucun résultat

Alors, après cette longue introduction de la question.

Est le genre de verrouillage comportement possible dans Oracle? Si oui, alors, que faisons-nous mal? Quelle serait la bonne solution?

OriginalL'auteur mateusz.fiolka | 2011-05-01