Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SqlConnection und die Vermeidung der Beförderung zu MSDTC

Ich bin etwas überrascht, dass Sie das sehen, weil RequiresNew sollte bedeutet, dass es von der anderen Transaktion isoliert ist; Normalerweise bedeutet diese Meldung, dass 2 Verbindungen innerhalb eines Transaktionsbereichs aktiviert wurden - sind Sie sicher Gibt es keinen anderen Code, der eine Verbindung innerhalb dieses Blocks erstellt / öffnet?

Ihre vorgeschlagene Lösung sollte funktionieren - obwohl in gewisser Weise TransactionScopeOption.Suppress kann bequemer sein, als Ihre Konfiguration zu ändern (aber beides sollte funktionieren). Allerdings gibt es ein Problem:ADO.NET-Transaktionen müssen an die einzelnen Befehle übergeben werden, also müssten Sie (auch den Code etwas aufräumen):

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

wobei CommitChanges akzeptiert eine Transaktion - vielleicht mit optionalen Parametern:

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

Ihre Benennung von DapperFactory schlägt vor, dass Sie "dapper" verwenden - in diesem Fall können Sie das einfach an "dapper" übergeben, unabhängig davon, ob es null ist oder nicht, dh

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