Les transactions imbriquées échouent

ado.net c# dapper sql-server transactions

Question

J'utilise des transactions imbriquées à l'aide de l'interface IDBConecction sur c #. Je dois des méthodes qui insèrent des données dans 2 tables différentes, mais en ce qui concerne la deuxième insertion, la première transaction d'insertion verrouille la seconde provoquant une exception de délai d'attente.

public void FirstInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //1st insert
                SecondInsert() //calling second insert method
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

public void SecondInsert()
{
    using (var cn = new Connection().GetConnection())
    {
        cn.Open();
        using (var tran = cn.BeginTransaction())
        {
            try
            {
                //2nd insert, this one fails
                tran.Commit();                
            }
            catch
            {
                tran.Rollback();
            }
        }
    }
}

Lorsque je vérifie que SqlServer fisrt insert a le SPID 56, lorsque la deuxième insertion est effectuée avec SPID 57 et que j'utilise

exec sp_who2

Dans la colonne "BlkBy" pour SPID 57, il est indiqué qu'il est bloqué par SPID 56.

Comment puis-je surmonter ces problèmes?

Réponse populaire

Utilisez une connexion pour les deux opérations. Cela implique probablement de passer l'objet de connexion.

Généralement, le modèle de connexion + transaction par requête résout correctement ce problème. L'ouverture d'une connexion dans toutes sortes de méthodes est une odeur de code. Cela montre que l'infrastructure ne parvient pas à gérer cela.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi