Scénario :
Une procédure stockée (Procédure A) a besoin d'un accès exclusif à la table 'a' pour effectuer des mises à jour. Un rapport dans SQL Server Reporting Services (SSRS) doit afficher les données de « a » uniquement une fois la procédure A terminée, évitant ainsi les incohérences.
Solution :
Le moyen le plus efficace de garantir cela est d'utiliser des transactions et des conseils de verrouillage appropriés :
Exemple de code :
<code class="language-sql">CREATE PROCEDURE ProcedureA AS BEGIN BEGIN TRANSACTION; -- Initiate a transaction SELECT ... FROM a WITH (XLOCK, HOLDLOCK); -- Exclusive lock (XLOCK) and hold the lock until the transaction ends (HOLDLOCK) WHERE ...; -- Perform operations not directly involving table 'a' here... -- Update table 'a' ... COMMIT TRANSACTION; -- Commit the transaction, releasing the lock END;</code>
Explication :
BEGIN TRANSACTION;
: Démarre une transaction. Toutes les opérations au sein de la transaction sont traitées comme une seule unité de travail.SELECT ... FROM a WITH (XLOCK, HOLDLOCK);
: Cette déclaration SELECT
, de manière cruciale, utilise l'indice XLOCK
pour acquérir un verrou exclusif sur la table 'a'. HOLDLOCK
garantit que le verrou est maintenu jusqu'à ce que la transaction soit terminée, même sur plusieurs relevés. Cela empêche tout autre processus de lire ou d'écrire sur « a » pendant l'exécution de la procédure A.-- Perform operations not directly involving table 'a' here...
: D'autres opérations peuvent être effectuées ici.-- Update table 'a' ...
: Les mises à jour de la table 'a' sont effectuées au sein de la transaction.COMMIT TRANSACTION;
: La transaction est validée, rendant les modifications permanentes et libérant le verrou exclusif sur la table 'a'. Si une erreur se produit, ROLLBACK TRANSACTION;
doit être utilisé pour annuler toute modification et libérer le verrou.Cette approche garantit l'intégrité des données en empêchant l'accès simultané à la table pendant l'exécution de la procédure stockée. Le rapport SSRS reflétera alors avec précision les données mises à jour une fois la procédure terminée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!