Question

Dans ma demande actuelle, j'effectue une mise à jour en invoquant la commande T-SQL de mise à jour. Le problème est quand le même enregistrement est verrouillé par d'autres utilisateurs à ce moment-là.

A l'application .NET, l'application attendra jusqu'à ce que TEMPORISATION SQL Server, il lancera le délai d'attente SqlException.

Est-il possible d'effectuer une vérification d'abord si un enregistrement particulier est verrouillé par un autre processus plutôt que d'attraper l'exception?

Était-ce utile?

La solution

Non, pas vraiment.

La méthode standard consiste à utiliser try/catch et poignée SqlException Nombre 1205 (victime de blocage), et recommencez votre requête:

    try
    {
        // do stuff...
    }
    catch (SqlException sqlEx)
    {
        switch (sqlEx.Number)
        {
            case -2:   // Client Timeout
            case 701:  // Out of Memory
            case 1204: // Lock Issue 

            case 1205: // >>> Deadlock Victim
                // handle deadlock
                break;

            case 1222: // Lock Request Timeout
            case 2627: // Primary Key Violation
            case 8645: // Timeout waiting for memory resource 
            case 8651: // Low memory condition 
            ...
        }
    }

[Note: Les déclarations de rupture non ajouté pour la compacité

Notez également , de nombreux problèmes de verrouillage peut être éliminé en fournissant les indices de couverture approprié.

Autres conseils

Vous pouvez utiliser une connexion séparée avec délai très court pour tenter de verrouiller l'enregistrement en mettant à jour un champ, mais cela ne va pas encore vous donner une fiabilité à 100%.

si vous avez vraiment la situation avec plusieurs utilisateurs d'édition mêmes enregistrements, vous devriez regarder dans les techniques de verrouillage optimistes.

En outre, assurez-vous que vous ne permettez pas aux utilisateurs de verrouiller les enregistrements du tout - utilisez le mode déconnecté pour les mises à jour. En d'autres termes, le verrouillage ne se produira que pendant une courte période de mise à jour (<100 ms)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top