Obtenir un accès exclusif aux lignes avec SQL Server : explorer SELECT FOR UPDATE
Le concept de SELECT FOR UPDATE est bien connu dans Oracle, DB2 , et MySQL, permettant aux développeurs d'acquérir des verrous exclusifs sur les lignes lors de la récupération des données, empêchant ainsi d'autres transactions simultanées de modifier les données sélectionnées. Cependant, lorsqu'il s'agit d'utiliser SELECT FOR UPDATE avec SQL Server, il existe quelques différences notables.
Dans le code fourni, la tentative d'utilisation de WITH (updlock) pour obtenir un verrouillage au niveau des lignes n'a pas donné l'effet souhaité. résultat, car cela empêchait également d’autres connexions de sélectionner différentes lignes. Pour résoudre ce problème, explorons différentes options pour SELECT FOR UPDATE dans SQL Server :
ROWLOCK
L'indice ROWLOCK peut être utilisé pour définir le verrouillage au niveau des lignes, mais il verrouille la ligne entière, même pour les opérations SELECT sur des lignes différentes. Ce comportement correspond au même scénario de ligne, mais pas au scénario de ligne différent.
updlock, rowlock
La combinaison de updlock et de rowlock n'améliore pas la situation ; cela entraîne toujours un blocage pour les SELECT de lignes identiques et différentes.
xlock,rowlock
Comme updlock,rowlock, cette combinaison fournit un verrouillage large, affectant à la fois les mêmes et les différents sélections de lignes.
repeatableread
Repeatableread est un niveau d'isolement qui empêche les anomalies de manipulation des données telles que les lectures fantômes. Cependant, il n'effectue pas de verrouillage au niveau des lignes, n'offrant aucune solution à cette exigence.
DBCC TRACEON (1211,-1)
Cet indicateur de trace définit une base de données -wide ROWLOCK pour toutes les opérations de lecture, simulant efficacement le verrouillage au niveau des lignes. Cependant, cela affecte toutes les connexions et peut ne pas être approprié dans tous les scénarios.
rowlock,xlock,holdlock
Cette combinaison verrouille également toute la ligne pour les SELECT, y compris ceux sur différentes lignes.
updlock,holdlock
Similaire à rowlock,xlock,holdlock, cette combinaison fournit un verrouillage au niveau de la ligne mais l'étend pour inclure la sémantique HOLDLOCK.
UPDLOCK,READPAST
Pour le niveau d'isolement des instantanés, cette combinaison permet SELECT sans verrous de ligne pour les lectures validables. Cependant, il ne fournit pas de verrous exclusifs et peut ne pas convenir à ce cas d'utilisation.
Conclusion
Malheureusement, aucune des options explorées ne fournit le comportement exact de SELECT POUR MISE À JOUR comme connu dans d'autres SGBD avec SQL Server. Bien que le verrouillage au niveau des lignes soit une option via ROWLOCK, il affecte également d'autres opérations SELECT, ce qui peut ne pas être souhaitable. Dans de tels cas, la détection des blocages et des problèmes de simultanéité des instantanés peut être une alternative nécessaire pour atteindre le niveau souhaité de cohérence des données.
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!