2010-09-23 12 views
2

Mon exigence est d'extraire un identifiant unique de la base de données pour traitement sur le serveur d'applications (application en cluster) .Pour cela, j'ai une table avec une seule cellule contenant une valeur X. Cette valeur sera incrémentée chaque fois qu'il est récupéré.Transactions de base de données simultanées

BEGIN TRAN 
     UPDATE ID_TABLE SET VALUE = VALUE + 1 
     SELECT VALUE FROM ID_TABLE 
END TRAN 

Considérons un calendrier de deux transcations (T2 T1 &) se produisant comme suit. MISE À JOUR (T1), MISE À JOUR (T2), LIRE (T1), LIRE (T2)

Un tel entrelacement est-il possible, pour les transactions de base de données.

Existe-t-il des moyens d'éviter cela, sauf le fait d'acquérir un verrou sur la table, au début, et de le relâcher à la fin, ce qui va isoler la transaction?

Répondre

2

Un tel entrelacement est-il possible, pour les transactions de base de données?

Non, aux niveaux habituels d'isolation des transactions, cela ne se produira pas (voir ci-dessous).

Existe-t-il des façons d'éviter ce en dehors de l'acquisition d'un verrou sur la table

Encore une fois, dans les implémentations habituelles (comme Oracle), vous êtes déjà verrouillage de la ligne lorsque vous mettez à jour. La deuxième transaction bloquera sur son appel de mise à jour jusqu'à ce que le premier soit validé. De plus, vous n'aurez pas de lectures incorrectes (en lisant une valeur non validée de l'autre transaction).

Si votre base de données fournit un générateur de séquence, vous devriez probablement utiliser cette fonction (elle a été créée précisément dans ce but).

+0

est-il pas possible que le verrou exclusif de la ligne, est libéré après la déclaration de mise à jour. Ainsi, une transaction continue-t-elle de rassembler des verrous et ne les libère qu'une fois terminée? –

+0

Cela dépend des niveaux d'isolation des transactions, je suppose. Mais les verrous "normalement" ne sont libérés que lorsque vous validez (ou annulez). – Thilo

0

Ceci est géré par le 'niveau d'isolation de transaction' que vous spécifiez. Je ne sais pas comment cela est fait dans d'autres DB, mais dans Sql Server (et dans Access), vous pouvez spécifier le niveau d'isolation qui doit être utilisé lorsqu'une transaction est démarrée.

Les options sont:

  • lecture non validée
  • read committed
  • répétable lire
  • sérialisable

Pour SqlServer, le niveau d'isolation par défaut est ReadCommitted. Ce mode d'isolation s'assure que les autres connexions ne peuvent pas lire/voir les données modifiées par d'autres transactions non validées.

Pour plus d'informations sur les niveaux d'isolement, vérifier this article