Disons-vous ont la table t (I international non nul, un char (1))
insérer dans t choisissent 1, « a »
fileter les issues A1 ceci :
commencer la transaction
PLACER QU'ON PEUT RÉPÉTER DE NIVEAU D'ISOLEMENT DE TRANSACTION LU
choisir * à partir de t où i=2
et se repose alors juste là. Vient le long le fil B et les issues
choisir * à partir de t où i=2
mettre à jour l'a='c réglé de t où i=2
Le ęr de ces rapports du b réussira, mais 2èmes attendront jusqu'au fil A ont publié commettent. Il y a un problème cependant : il est facile de voir que B peut facilement dépasser la modification apportée par A, s'il agit basant sur ce qu'il voit quand il a recherché la rangée. Que cette raison, il vaut mieux publie
a='c réglé de la mise à jour t où i=2 et a='a
Ceci vérifie effectivement que B met à jour ce qu'il pense qu'il met à jour. Et c'est exactement comme le curseur client-basé fonctionne, qui est le type le plus habituel du curseur utilisé dans des instruments de développement d'aujourd'hui, particulièrement basé sur le WEB : aucune transaction, aucune serrure, mais pendant la vérification de mise à jour de tous les champs qui ont été lus, et le cas échéant n'a changé, puis message d'erreur de sorte qu'un autre utilisateur ait modifié le resultset.
Si vous voulez éliminer ceci, alors vous devez publier le niveau bien plus restrictif SERIALIZABLE d'isolement de transaction dans le fil B, et dès que vous lirez les rangées dans A, les mettez à jour là en employant une certaine colonne factice juste à cette fin. Alors B ne pourra pas voir les rangées qui peuvent être modifiées par A - qui est correct, parce qu'autrement B ne saurait pas que ces rangées sont maintenant fonctionnées dessus à côté de l'A. Mais ceci naturellement apporte l'issue d'A se brisant, partant pour le déjeuner, etc., etc.
Pour cette raison, le curseur client-situé est probablement la manière la plus pratique de faire tout ceci, qui est pourquoi c'est le type le plus répandu d'opérations de base de données aujourd'hui.