Явление взаимоблокировки распределенных транзакций .Net и решение

В этой статье я расскажу о явлении взаимоблокировки распределенных транзакций .Net, с которым столкнулись однажды, и о решении. Сначала мы разберемся с составом транзакционной структуры, затем проанализируем код, вызывающий взаимоблокировку, и, наконец, предложим решение.

структура транзакции

Фреймворк разработки JMSFramework делит распределенные транзакции на четыре этапа, а именно: выполнение, подтверждение, отправка и повторная попытка.

1. Выполнение
Вызовите микросервисы для выполнения связанных бизнес-операций. Если выполнение любого из этих сервисов вызывает исключение или происходит сбой, все транзакции откатываются.

2. Подтверждение
На этом этапе каждому микросервису будет отправлен запрос на подтверждение. Основная цель — проверить, работает ли текущая сеть в норме и не работает ли микросервис. Если на этом этапе возникнут какие-либо отклонения, все транзакции будут свернуты. назад.

3. Отправить
. Сначала JMSFramework уведомит шлюз о необходимости пометить распределенную транзакцию как успешную. (Если шлюз уведомлений выйдет из строя, все транзакции будут отменены.) Затем
уведомите каждую микрослужбу о необходимости зафиксировать транзакцию, чтобы убедиться, что все операции завершены.
Если службе не удается зафиксировать транзакцию, это не повлияет на другие службы для фиксации транзакций.

4. Повторите попытку.
Вероятность того, что выполнение достигнет этой стадии, очень мала.
Когда микрослужба неожиданно выходит из строя, когда транзакция фактически зафиксирована, транзакция не была успешно зафиксирована. Как только сервер перезапускается, он консультируется со шлюзом и узнает, что транзакция отмечена как успешная. В это время система автоматически повторно выполнит соответствующий бизнес-код и отправит транзакцию, чтобы обеспечить согласованность данных.

заблокированный код

Далее давайте посмотрим на код, который запускает взаимоблокировку:

            using ( var client = new RemoteClient(gatewayAddrs))
            {
                //标识后面的调用需要启用分布式事务控制
                client.BeginTransaction();
                
 

рекомендация

отblog.csdn.net/shengyin714959/article/details/131640760