2015-03-06 3 views
1

J'ai deux scénarios exécutant le même code et l'un fonctionne à 100% du temps tandis que l'autre échoue tout aussi souvent.La connexion SQL ne s'exécute pas pendant la transaction

J'ai 2 connexions sql pointant vers le même serveur SQL localement pendant qu'une transaction est en cours. Lorsque j'essaie d'exécuter une requête sur la deuxième connexion, cela expire. Pendant le débogage, je peux même aller dans SSMS et essayer d'exécuter une requête et elle restera là aussi. Le fait que cela fonctionne dans l'autre scénario est étrange, mais finalement j'essaie de comprendre pourquoi sql est verrouillé quand je cours l'autre sqlconnection.

Est-ce que quelqu'un a des idées sur ce qui pourrait causer ce ou tout les outils de débogage que je pourrais utiliser? Je ne suis pas intéressé par l'utilisation d'un transactionScope.

Si je ferme la première connexion au préalable, la requête de la deuxième connexion fonctionnera correctement.

Voici quand le problème se produit. À ce stade, nous avons SQLConnection1 qui a une transaction attachée et le fonctionnement:

    SqlConnection connection = new SqlConnection(ConnectionString); 
        connection.Open(); 

        SqlCommand command = new SqlCommand("", connection); 


        command.CommandText = "a read command" 
        int count = command.ExecuteScalar(); 
+0

Pouvez-vous joindre une connexion à la même transaction que sqlConnection1? Cela devrait être assez facile si vous utilisez des portées de transaction, mais si votre fournisseur sql ne le permet pas .. – Juan

+0

Non, je ne peux malheureusement pas associer la transaction avec plusieurs connexions. J'étais conscient que la portée l'a fait cependant, c'est pourquoi j'ai essayé d'utiliser cela avant de réaliser qu'il avait besoin de ce service. Je le ferais si c'était un projet personnel, mais ce n'est pas faisable pour moi d'exiger ce service maintenant. – user1427105

+0

Et pourquoi utiliser deux connexions alors? – Juan

Répondre

2

Comme indiqué, la première chose est que si vous n'avez pas besoin de deux connexions, vous pouvez simplement utiliser un si tout se passe dans la même transaction.

Si vous avez besoin que cet ensemble de SQL s'exécute en parallèle avec d'autres processus ou threads exécutant des requêtes similaires, vous pouvez réexaminer l'isolation et le verrouillage de vos instructions.

Vous exécutez probablement la première transaction en tant qu'isolement Serializable et en effectuant des mises à jour sur celle-ci. Pensez à utiliser ReadCommited (ou Snapshot ReadCommited). Mais cela dépend de votre travail actuel.

De SSMS, essayez d'exécuter d'abord

SET TRANSACTION ISOLATION LEVEL READUNCOMMITTED 

Cela devrait éviter les verrous créés par transaction poing, mais cela est juste pour que vous pouvez voir pourquoi sa passe, n'est pas une bonne idée d'utiliser ce niveau d'isolement!

+0

Cela m'a permis d'exécuter des requêtes dans SSMS. Je ne suis pas familier avec cela alors laissez-moi faire quelques recherches et je vous ferai savoir si cela résout mon problème. Merci pour l'information! – user1427105

+0

La façon la plus simple de modifier le niveau d'isolation consiste à créer une étendue de transaction, sans savoir pourquoi vous souhaitez l'éviter. – Juan

+0

Il semble que je puisse toujours définir le niveau IsolationLevel d'une SqlTransaction de base. J'évite la portée car je n'utilise pas le service Sql dont il a besoin (le nom m'échappe maintenant). – user1427105