Oracle
 sql >> база данни >  >> RDS >> Oracle

EF и TransactionScope както за SQL Server, така и за Oracle без ескалиране/обхват до DTC?

Първо:никога не използвайте var ts = new TransactionScope() . Това е единствената линия, която убива приложението ви. Винаги използвайте изричния конструктор, който ви позволява да посочите нивото на изолация. Вижте използването на нов TransactionScope() се счита за вреден.

Сега относно въпроса ви:логиката да не се популяризират две връзки в един и същи обхват в DTC разчита до голяма степен на сътрудничеството на драйвера/доставчиците, за да информират System.Transactions, че двете отделни връзки са способни да управляват разпределената транзакция добре сами по себе си, защото участващите мениджъри на ресурси са едни и същи. SqlClient post SQL Server 2008 е драйвер, който е в състояние да изпълнява тази логика. Драйверът на Oracle, който използвате, не е (и не знам за нито една версия, между другото).

В крайна сметка е наистина много основно:ако не искате DTC, не създавайте такъв! Уверете се, че използвате точно една връзка в обхвата. Очевидно е спорно, че нямате нужда от две връзки. С други думи, отървете се от двете отделни хранилища във вашия модел на данни. Използвайте само едно хранилище за поръчки, инвентар и какво ли още не. Прострелвате се в крака с тях и искате решения за прах от пикси.

Актуализация:драйвер на Oracle 12c r1:

„Асоциация на транзакции и връзки:ODP.NET връзките по подразбиране се отделят от транзакциите само когато обектите за връзка са затворени или обектите на транзакциите са изхвърлени“



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете обект oracle.sql.ARRAY?

  2. Алтернативи на LIMIT и OFFSET за пейджинг в Oracle

  3. SQL (ORACLE):ORDER BY и LIMIT

  4. Клиент на Oracle ORA-12541:TNS:няма слушател

  5. Функция LISTAGG:резултатът от конкатенацията на низове е твърде дълъг