Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

SqlConnection i unikanie promocji do MSDTC

Jestem nieco zaskoczony, że to widzisz, ponieważ RequiresNew powinien oznaczają, że jest oddzielony od innej transakcji; zwykle ten komunikat oznacza, że ​​2 połączenia zostały aktywowane w zakresie transakcji - czy jesteś pewny? nie ma innego kodu tworzącego / otwierającego połączenie wewnątrz tego bloku?

Zaproponowane rozwiązanie powinno działać - chociaż w pewnym sensie TransactionScopeOption.Suppress może być wygodniejsze niż zmiana konfiguracji (ale obie powinny działać). Jest jednak problem:transakcje ADO.NET muszą być przekazywane do poszczególnych poleceń, więc potrzebujesz (również trochę porządkując kod):

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

gdzie CommitChanges akceptuje transakcję - być może używając opcjonalnych parametrów:

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

Twoja nazwa DapperFactory sugeruje, że używasz "dapper" - w takim przypadku możesz po prostu przekazać to do "dapper", niezależnie od tego, czy jest null, czy nie, tj.

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić przyrostowy numer grupy na grupę w SQL?

  2. Funkcje SQL — silnia

  3. Jaka jest poprawna składnia używania Database.ExecuteSqlCommand z parametrami?

  4. Pobierz poprzedni i następny wiersz z wierszy wybranych z warunkami (WHERE)

  5. Ponieważ nie ma parametru tablicy Sqlserver, jaki jest najlepszy sposób postępowania?