2011-09-23 4 views
4

Je suis confus. Je lis à propos de MVCC dans Oracle. Je pensais que MVCC ne signifiait pas de verrous. Mais, j'ai lu ailleurs que tous les UPDATE s verrouillent automatiquement, quel que soit le niveau d'isolement. Quelqu'un peut-il expliquer ce qui se passe lors d'une mise à jour Oracle? Et que se passe-t-il lorsque plusieurs transactions validées en lecture essayent de faire un update t set c = c + 1 where id = 3 concurrent. Quel est le résultat, donné c = 1 avant l'une des transactions, et que se passe-t-il avec les verrous et SCN?Mises à jour simultanées dans Oracle: Verrouillage ou non?

Begin T1 
Begin T2 
T1: update t set c = c + 1 where id = 3 
T2: update t set c = c + 1 where id = 3 
Commit T1 
Commit T2 

Répondre

6

Vous avez raison, cela verrouille la ligne quel que soit le niveau d'isolement. Avec MVCC, vous pouvez obtenir des lectures cohérentes sans verrous, mais vous avez toujours besoin de verrous lors de l'écriture.

La deuxième transaction attendra que le premier se termine (par exemple: COMMIT ou ROLLBACK) avant d'essayer de faire quoi que ce soit. Donc, dans ce cas, le curseur sur T2 "se bloque" sur la mise à jour, en attendant que T1 se termine.

Vous obtiendrez un nouveau numéro SCN une fois que le T1 aura été validé et un autre après l'acceptation de T2.

+0

Merci. Donc, MVCC signifie que ce verrou n'affecterait pas les lectures, cependant, non? Juste d'autres écrit à ce même enregistrement, où id = 3? –

+0

@RonGarrity Yup. Oracle peut utiliser le journal d'annulation pour fournir une vue cohérente en lecture de la base de données à toutes les sessions qui y sont connectées. – NullUserException

Questions connexes