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

Transactionscope-Ausnahmeausnahme Diese Plattform unterstützt keine verteilten Transaktionen beim Öffnen des Verbindungsobjekts

.NET Core unterstützt keine verteilten Transaktionen, da hierfür auf jeder Plattform ein anderer Transaktions-Manager erforderlich wäre. Es kann in Zukunft auftreten (hier ist das Problem in Bearbeitung), aber im Moment wird jede Transaktion, die zwei verschiedene Ressourcenmanager erfordern würde, diese Ausnahme auslösen.

Stattdessen können Sie separate Transaktionen koordinieren. Lassen Sie zwei separate Transaktionen ihre Arbeit abschließen und schreiben Sie sie dann beide fest. Es gibt eine Möglichkeit dass der erste Commit erfolgreich ist und der zweite fehlschlägt, aber für SQL Server wäre das ein sehr seltenes Ereignis. Etwas wie:

            _db1UOW.Begin(); //creating sql transaction
            await _db1UOW.IDenialDetailsRepositorydb1.InsertDenialDetails(denialsDetails);
            await _db1UOW.IRuleDetailsRepositorydb1.InsertRulesDetails(rulesDetails);

            _db2UOW.Begin(); //creating sql transaction 
            await _db2UOW.IRuleDetailsRepository.GetRulesDetails();
            await _db2UOW.IDenialDetailsRepository.InsertDenialDetails(denialsDetails);
            var data = await _db2UOW.IRuleDetailsRepository.InsertRulesDetails(rulesDetails);

            _db1UOW.Commit(); //commitng sql transaction
            try
            {
               _db2UOW.Commit(); //commitng sql transaction
            }
            catch (Exception ex)
            {
               LogError("Second transaction failed to commit after first one committed.  Administrators may need to fix stuff");
               throw;
            }

Oder wenn sich die beiden Datenbanken auf demselben Server befinden, können Sie datenbankübergreifende Abfragen mit einer einzigen SqlConnection verwenden, um die Änderungen in einer einzigen SQL Server-Transaktion einzutragen.