Я использую распределенные транзакции с классом TransactionScope с SQL Server и PostgreSQL.

У меня есть некоторые опасения по поводу возможных сбоев, и если это происходит при фиксации всей распределенной транзакции, мне интересно, есть ли потенциально подготовленные транзакции, оставленные и застрявшие в отношении PostgreSQL или SQL Server? Если это так, как этого избежать?

1
Kerry Perret 5 Май 2020 в 14:11

2 ответа

Лучший ответ

Я не могу говорить за SQL Server, но в Postgres, да, это может произойти.

Теоретически ответственность за их очистку несет менеджер транзакций (программное обеспечение, управляющее распределенной транзакцией).

Если менеджер транзакций не очищается должным образом (например, после сбоя), то вам нужно сделать это вручную.

Вы можете использовать системное представление pg_prepared_xacts для мониторинга «подготовленные транзакции».

Вы можете запросить это представление и проверить возраст транзакций. Если этот возраст превышает некоторый порог (подходит для вашей среды), вы можете прекратить их вручную, используя rollback prepared

2
a_horse_with_no_name 5 Май 2020 в 12:38

Да, это возможно, но Крайне маловероятно, так как открытые транзакции будут отменены.

System.Transaction использует встроенный в Windows брокер транзакций, который реализует 3-х фазную фиксацию. Ваша система должна произойти сбой в ОЧЕНЬ определенный момент для проблем (которые приводят к нарушению передачи, которое можно откатить вручную в пользовательском интерфейсе tx manager). И используйте БОЛЬШЕ, ЧЕМ ОДИН RESSOURCE (то есть соединения 2 дБ), иначе он просто оборачивает локальную транзакцию одного ресурса.

Есть причина, по которой некоторые системы используют 5-фазные протоколы фиксации (так что есть вероятность, что что-то пойдет не так), но это уже ОЧЕНЬ достоверно. Обратите внимание, что tx записываются в постоянный журнал, если вы не говорите только об одном ресурсе транзакции.

2
TomTom 5 Май 2020 в 12:46