TransactionScope: существует ли риск призрачных транзакций с распределенными транзакциями, когда происходит cra sh? - PullRequest
1 голос
/ 05 мая 2020

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

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

[РЕДАКТИРОВАТЬ 1]

Я также настоятельно рекомендую прочитать комментарии ниже к этой статье .

I quote:

[...] Что, если это Oracle база данных, работающая на Linux? Или RavenDB, работающий в облаке? В обоих случаях необходимо использовать прокси.

[...] Вам необходимо go и вручную решить эти проблемы, потому что в результате этой проблемы вы навсегда заблокировали транзакции.

[РЕДАКТИРОВАТЬ 2] Добавление дополнительной информации TransactionScope: https://www.codeproject.com/Articles/690136/All-About-TransactionScope

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Да, это возможно, но это КРАЙНЕ маловероятно, поскольку открытые транзакции будут отменены.

System.Transaction полагается на встроенного брокера транзакций windows, который реализует трехфазную фиксацию. Ваша система должна искать sh в ОЧЕНЬ конкретный c момент для проблем (что приводит к неработающей транзакции, которую можно откатить вручную в пользовательском интерфейсе tx manager). И используйте БОЛЕЕ ОДНОГО РЕСУРСА (т.е. 2 соединения с базой данных), в противном случае он просто обертывает локальную транзакцию с одним ресурсом. но это уже ОЧЕНЬ надежно. Обратите внимание, что tx записываются в постоянный журнал, ЕСЛИ вы не говорите только об одном ресурсе транзакции.

2 голосов
/ 05 мая 2020

Я не могу говорить за SQL Сервер, но в Postgres да, это может случиться.

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

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

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

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

...