2011-04-15 4 views
0

Ma configuration - Un serveur avec deux instances SQL Server 2000, INSTANCE1 et INSTANCE2. Chaque instance a 1 DB, DBprod et DBstag.Verrouillage exclusif SQL Server 2000

J'ai une situation où j'ai besoin de préparer des factures pour plusieurs clients, donc je voudrais placer un verrou exclusif sur une table pendant que je vais chercher un numéro de facture de INSTANCE1.DBprod.LastInvoiceNumber à INSTANCE2.DBstag, effectuer un calcul de soem, Préparez une facture, puis insérez la facture (en-tête et détails) dans INSTANCE1.DBprod, puis mettez à jour INSTANCE1.DBprod.LastInvoiceNumber, répétez l'opération pour le client suivant, puis relâchez le verrou après avoir terminé avec tous les clients.

commencer trans inv

EXCLUSIVEMENT BLOQUER INSTANCE1.DBprod.LastInvoiceNumber

curseur client ouvert

du client suivant d'extraction

get numéro de facture de INSTANCE1.DBprod.LastInvoiceNumber

facture préparer

facture d'insertion pour INSTANCE1.DBprod

mise à jour INSTANCE1.DBprod.LastInvoiceNumber (incrément par 1)

d'extraction suivante du client (préparer facture client suivant )

fermer curseur client

commit trans inv

RELEASE LOCK ON INSTANCE1.DBprod.LastInvoiceNumber

Serait-ce ma solution

SET TRANSACTION ISOLEMENT NIVEAU SERIALIZABLE

Il y a une application comptable en utilisant INSTANCE1.DBprod .LastInvoiceNumber c'est pourquoi je veux verrouiller exclusivement la table jusqu'à ce que j'ai fini de poster toutes mes factures.

Répondre

0

L'une des manières les plus simples est d'utiliser sp_getapplock pour n'autoriser qu'une seule session. D'autres sessions vont attendre/échouer

Ceci est indépendant de la granularité et de l'isolement du verrou et il est souvent préférable dans ce scénario. Utiliser SERIALIZABLE n'est pas exclusif: vous auriez besoin de TABLOCKX. Mais d'autres lecteurs sur la table sont également bloqués

sp_getapplock ne s'appliquera qu'à la portée de ce code.

+0

Je prépare les factures via un proc stocké. Mon intention est de bloquer toutes les applications d'utiliser le INSTANCE1.DBprod.LastInvoiceNumber jusqu'à ce que j'ai fini de poster toutes mes factures ... Je vais regarder dans votre suggestion. –