Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SqlConnection et éviter la promotion vers MSDTC

Je suis quelque peu surpris que vous voyiez cela, car le RequiresNew devrait signifier qu'il est isolé de l'autre transaction ; généralement, ce message signifie que 2 connexions ont été activées dans une portée de transaction - êtes-vous sûr il n'y a pas d'autre code créant/ouvrant une connexion à l'intérieur de ce bloc ?

Votre solution proposée devrait fonctionner - bien que d'une certaine manière TransactionScopeOption.Suppress peut être plus pratique que de changer votre configuration (mais l'un ou l'autre devrait fonctionner). Cependant, il y a un problème :les transactions ADO.NET doivent être transmises aux commandes individuelles, vous auriez donc besoin (également en rangeant un peu le code) :

using(var transaction = conn.BeginTransaction()) {
    try {
        var count = _changeTracker.CommitChanges(conn, transaction);
        transaction.Commit();
        return count;
    } catch {
        transaction.Rollback();
        throw;
    }
}

CommitChanges accepte une transaction - peut-être en utilisant des paramètres facultatifs :

int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }

Votre nom de DapperFactory suggère que vous utilisez "dapper" - auquel cas, vous pouvez simplement le passer dans "dapper", qu'il soit nul ou non, c'est-à-dire

conn.Execute(sql, args, transaction: transaction);