Les transactions SQL sont utilisées pour insertion, mise à jour, mais doivent-elles être utilisées pour la lecture des enregistrements? P>
7 Réponses :
L'emballage de transaction n'est pas nécessaire pour des lectures pures.
Dans votre relevé SQL, les indications de verrouillage doivent prendre soin de vous renvoyer des données appropriées ( http://msdn.microsoft.com/en-us/library/aa213026%28SQL.80%29.aspx ). P>
sur un niveau de serveur, vous pouvez définir des niveaux d'isolation de transaction ( http://msdn.microsoft.com/en-us/library/ms173763.cox ). P>
Modifier strong> p> Exploiter pur lit p> si tout votre instruction SQL a ce type de lecture, vous n'avez pas besoin d'envelopper une transaction p> si vous lisez des résultats qui peuvent être affecté par d'autres transactions en parallèle, vous devez envelopper une transaction. EG: P> BEGIN TRANSACTION
INSERT INTO AccountTransactions (Type, Amount) Values ('Credit', 43.21)
UPDATE AccountSummary SET Balance = Balance + 43.21
SELECT @Balance = Balance FROM AccountSummary
COMMIT TRANSACTION
Dans l'exemple suivant, tout processus simultané pourrait interférer avec les tables que vous lisez. Il n'y a pas d'écriture de données, mais il y a des calculs entre des lectures connexes. En tant que telle transaction, il serait nécessaire de protéger l'état des données. Insérer dans @temp sélectionnez
Ce n'est pas une lecture pure cependant. Raj a déclaré que "l'emballage de transaction n'est pas nécessaire pour des lectures pures".
Définir "PURE Lecture", l'exemple que j'ai donné n'inquiète, met à jour ni ne supprime à autre chose qu'une variable. [Il pourrait s'agir d'une carte INT, d'une variable de table ou d'un autre conteneur de données pour faciliter les calculs qui définiront ensuite le comportement de la lecture finale]
Vous modifiez les appels de structure @temp. C'est une déclaration d'insertion, pas une lecture pure, surtout si votre @temp est utilisé dans la déclaration Selet
Mais d'une billet noire, rien dans la base de données n'a changé. Par exemple, les variables TEMP peuvent être utilisées dans des fonctions définies par l'utilisateur. Par votre définition de "PURE Lecture", vous ne pouvez même pas utiliser des variables int, et, en tant que tel, je vous soutiendrais, vous êtes limité à une seule déclaration SQL. Je dirais que "la lecture pure" décrit en fait un processus qui ne provoque aucune modification (temporaire ou permanente) de la base de données ou de son contenu, être visible ou non à un autre processus. Dans mon esprit, n'exigeant que même des variables sont utilisées décrivent un scénario trop trivial.
Votre exemple de Supprimer de
Merci à tous les répondeurs, j'aimerais qu'il y ait la possibilité de marquer tout comme des réponses mais il n'y a pas. Merci d'avoir donné des exemples, pour donner un lien vers l'explication du verrouillage, pour expliquer comment obtenir des données à jour en millisecondes, merci.