2 phase commit в .net

В очередной раз наткнулся на эту тему недавно и решил разобраться. Вродк примерно понятно, но что-то как -то я это не особо где видел и решил поковырять нормально. Собственно что такое 2PC - это специальный протокол для распределенных транзакций, первая фаза prepare , вторая собственно commit(ну или rollback). Меня все время путало как это работает в шарпе и вот почему. Это нормально работает например в java - есть специальные Dstributed Transaction Coordinator (DTC) например atomikos, bitronix, narayana. Они подключаются к базам данных и очень легко и красиво работают в java. А теперь как все в .net... Есть MSDTC - те координатор от microsoft. И... Он работает только на windows) А еще это служба windows и она довольно неудобно коннктится с другими участниками процесса. При этом формально из кода мы вообще никак не работаем с этим напрямую, а просто используем TransactionScope и внутри обращаемся к одной базе и другой

`using (TransactionScope scope = new TransactionScope()) { // DB1 operation using (SqlConnection conn1 = new SqlConnection(connStr1)) { ... } // DB2 operation (triggers MSDTC) using (SqlConnection conn2 = new SqlConnection(connStr2)) { ... } scope.Complete(); }

И я за много лет работы никогда не видел чтобы с этим работали.

И наконец еще кое-что. Есть вот такая штука https://postgrespro.ru/docs/postgresql/current/sql-prepare-transaction .Но есть нюанс "PREPARE TRANSACTION не предназначена для использования в приложениях или интерактивных сеансах. Её задача — дать возможность внешнему менеджеру транзакций выполнять атомарные глобальные транзакции" Т е прямо в документации написано , что не надо использовать это из приложения. И когда я начал выяснять почему - потому что оно вроде как заработает, но если в определенный момент упадет база , то система останется в неконсистентном состоянии.

Собственно вывод - формально 2PC в .net можно реализовать MSDTC +transactionScope но никто так не делает. А то что действительно удобно в шарпе не нету.

#senior`