2011-09-27 2 views
0

Dans mon projet ASP.NET, je crée/ouvrir un SqlConnection si nécessaire, et le fermer à Application_EndRequestLorsqu'un SqlConnection est maintenu ouvert, est-il mis à jour?

Peu importe que, je me demande ce qui se passerait si, alors qu'une connexion (A-dire la connexion) est ouverte, la base de données est mise à jour à partir d'une autre requête (disons Connexion B).

Il est comme ça

(Say au départ x est 1)

A.Open()
B.Open()
B.UpdateX() -> SET x = 2
B.Close()
A.SelectX() -> cela retournerait-il 1 ou 2?
A.Fermer()

Répondre

2

Les données renvoyées dépendent de l'état de la base de données au moment de l'exécution de la requête et non au moment de l'ouverture de la connexion. Supposons que vous n'utilisiez aucune gestion de transaction spécifique dans votre code et supposons que l'instruction de mise à jour soit une mise à jour de ligne ou de table distincte. Dans ce cas, la connexion a verra X = 2. Cela est dû au fait que les deux connexions utiliseront le niveau de transaction par défaut lu pour les deux connexions. Maintenant, dans votre exemple, il est impossible de faire en sorte que la connexion A lise X = 1 s'il s'agit d'une seule mise à jour de valeur sur une seule ligne. Mais si vous utilisez une transaction sur la connexion B et ne commettez pas et laissez la connexion ouverte. La requête pour la connexion A bloquera jusqu'à ce que son délai expire. Fondamentalement, X ne serait pas accessible jusqu'à ce que B soit fait.

En outre, si vous mettez à jour 10 millions de lignes dans une transaction de connexion B et que la connexion A était dans un thread et une transaction différents. Il existe une possibilité pour la connexion A de lire certaines données anciennes/périmées/invalides en utilisant le niveau d'isolation de transaction "read uncommitted".

Espérons que cela aide.

2

Une connexion SQL ne se met jamais à jour - ce n'est rien de plus qu'un canal vers le serveur. C'est dire comme les mises à jour de votre voiture lorsque vous le déplacez ailleurs. Le côté serveur de transaction de la session auquel la connexion est attachée (remarque: vous pouvez avoir plusieurs connexions à la même transaction - même si je suis sûr que la plupart des gens ne le savent pas) (implicite ou explicite) montre les données en fonction à son niveau d'isolation configuré. Parfois, vous voulez quelque chose de ton, parfois l'autre. Asseyez-vous et concevez.

Maintenant, un élément avec garder la connexion ouverte est qu'il ne réinitialise pas correctement entre les pages qui peuvent conduire à toutes sortes de problèmes stupides sur la route. Assez antipattente. Nous avons eu un problème ici récemment dans un projet avec Oracle où le serveur déconnecte les clients après 2 heures sans demande de données. ... et la connexion n'est pas "close" (ou show closed) jusqu'à ce que le sql suivant soit envoyé. Conduit à des erreurs drôles vers le bas de la ligne que vous ne voulez pas - employez le pooling de connexion pour compenser la surcharge de performance.

Questions connexes