Oracle
 sql >> Baza danych >  >> RDS >> Oracle

EF i TransactionScope zarówno dla SQL Server, jak i Oracle bez eskalacji/rozszerzania do DTC?

Po pierwsze:nigdy nie używaj var ts = new TransactionScope() . To jedyny liniowiec, który zabija Twoją aplikację. Zawsze używaj jawnego konstruktora, który pozwala określić poziom izolacji. Zobacz użycie nowej funkcji TransactionScope() uznanej za szkodliwą.

Teraz o twoim pytaniu:logika, aby nie promować dwóch połączeń w tym samym zakresie do DTC, w dużej mierze zależy od sterownika/dostawców współpracujących w celu poinformowania systemu. Transakcje, że dwa różne połączenia są w stanie samodzielnie zarządzać transakcją rozproszoną, ponieważ zaangażowani menedżerowie zasobów są tacy sami. SqlClient po SQL Server 2008 to sterownik, który jest w stanie wykonać tę logikę. Sterownik Oracle, którego używasz, nie jest (i nie znam żadnej wersji, która jest, btw).

Ostatecznie jest to naprawdę bardzo proste:jeśli nie chcesz DTC, nie twórz go! Upewnij się, że używasz dokładnie jednego połączenia w zakresie. Jest oczywiste, że nie potrzebujesz dwóch połączeń. Innymi słowy, pozbądź się dwóch oddzielnych repozytoriów w swoim modelu danych. Używaj tylko jednego repozytorium dla zamówień, zapasów i czego jeszcze nie. Strzelasz sobie z nimi w stopę i prosisz o rozwiązania z chochlikami.

Aktualizacja:sterownik Oracle 12c r1:

"Powiązanie transakcji i połączenia:połączenia ODP.NET domyślnie odłączają się od transakcji tylko wtedy, gdy obiekty połączenia są zamknięte lub obiekty transakcji są usuwane"



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. interwał formatu z to_char

  2. Jak używać aliasu w klauzuli Gdzie?

  3. Jak używać wykonania natychmiastowego z klauzulą ​​INTO w bazie danych Oracle

  4. Jak rozwiązać ORA-29280:nieprawidłowa ścieżka do katalogu

  5. Pobierz wartość z FieldA, wyślij do funkcji db, zwróć wartość do FieldB