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"