2010-04-09 2 views
1

je la transaction suivante:Quel niveau d'isolation du serveur sql dois-je choisir pour empêcher les lectures simultanées?

  1. SQL insère un 1 nouvel enregistrement dans une table appelée tbl_document
  2. SQL supprime tous les enregistrements correspondant à un critère dans une autre table appelée tbl_attachment
  3. SQL insère plusieurs enregistrements dans la tbl_attachment

Tant que cette opération se termine, je ne veux pas que d'autres utilisateurs soient informés des (1) de nouveaux records en tbl_document, (2) les enregistrements supprimés dans tbl_attachment et (3) les enregistrements modifiés dans tbl_attac hment.

Est-ce que Read Is Committed Isolation est le niveau d'isolation correct?

+0

Quelle version de SQL Server? Si c'est en 2005 ou plus tard, cela devrait être géré correctement automatiquement (par défaut) par snapshotting. – RBarryYoung

+0

SQL Server 2005 –

Répondre

1

oui, comme ceci:

BEGIN TRANSACTION 

    insert into tbl_document ... 
    delete tbl_attachment where ... 
    inserts into tbl_attachment ... 

COMMIT 

vous pouvez bloquer/utilisateurs de blocage jusqu'à ce que vous avez terminé et engager/annuler la transaction. En outre, quelqu'un pourrait SELECT vos lignes de tbl_attachment après votre insertion dans tbl_document mais avant votre suppression. Si vous avez besoin pour éviter que faire ceci:

BEGIN TRANSACTION 

    select tbl_attachment with (UPDLOCK,HOLDLOCK) where ... 
    insert into tbl_document ... 
    delete tbl_attachment where ... 
    inserts into tbl_attachment ... 

COMMIT 

ou tout simplement supprimer tbl_attachment avant l'insertion dans tbl_document et oublier la sélection avec les indicateurs de verrouillage.

+0

Je remarque que vous ne spécifiez pas le niveau d'isolation. Est-ce parce que SQL Server 2005 par défaut à lire commited? Aussi ce code fonctionnerait-il de la même manière si je faisais une mise à jour au lieu d'un insert sur tbl_document? –

+0

Si tout le monde qui exécute votre application utilise 'read commited', alors il ne peut lire que les modifications qui ont été validées. Si vous essayez de lire des données qui changent (la transaction est toujours en cours), vous attendez que la transaction soit terminée avant que votre lecture soit traitée. Comme la suppression dans votre question, il y a un problème de synchronisation. Quelqu'un sera capable de lire les lignes que vous * avez l'intention de mettre à jour entre votre 'BEGIN TRANSACTION' et votre' UPDATE' actuel. Avec insert, ce n'est pas un problème (ils sont nouveaux, ils n'existent pas jusqu'à ce que vous les ayez mis). –

+0

suite .. Les verrous sont acquis au fur et à mesure que vous passez à la transaction. Si vous faites beaucoup dans la transaction avant votre 'update' et que vous voulez * geler * les gens de lire ces lignes à partir du moment où la transaction commence, alors vous pouvez essayer d'utiliser' SELECT ... WITH (UPDLOCK, HOLDLOCK) ' au début de la transaction. –

2

Le niveau d'isolation de transaction de votre écrit n'a pas d'importance. Ce qui est important est le niveau d'isolement de votre lit. Normalement, les lectures vont et non voir votre insertion/mise à jour/suppression jusqu'à ce que soit validée. Le seul niveau d'isolement peut voir les modifications non validées est READ UNCOMMITTED. Si le thread simultané utilise des lectures sales, il n'y a rien que vous pouvez faire dans l'écriture pour l'empêcher. READ UNCOMMITTED peut être soit défini comme niveau d'isolement, soit demandé explicitement avec un indicateur de table (NOLOCK)

Les lectures sales peuvent voir des données de transaction incohérentes (par exemple, le débit n'équilibre pas le crédit d'une opération) et peuvent également entraîner des lectures en double (lire la même ligne plusieurs fois depuis une table) et déclencher des violations de clés mystérieuses.

+0

l'isolement d'instantané n'empêchera-t-il pas de lire READ UNCOMMITTED et NOLOCK? –

+0

@KM: non.Vous pouvez tester cela facilement. Une écriture non validée à partir d'une transaction SNAPSHOT est parfaitement visible pour une lecture simultanée UNCOMMITTED. –

Questions connexes