Я предоставляю сервис WCF через basicHttpBinding
, который выполняет несколько операций с базой данных.
Я хочу гарантировать, что если клиент не получит ответ, операции базы данных будут отменены ( без какого-либо потока транзакций через WCF ).
Например. клиент вызывает метод «DoX», который выполняется на сервере, но до его завершения клиент падает. Операции с базой данных следует откатить, как только ответ не может быть отправлен клиенту.
Есть ли способ сделать это? Будет ли атрибут [OperationBehavior(TransactionScopeRequired=true)]
работать таким образом? Есть ли возможность обрабатывать ошибки связи на стороне сервера?
Обновление 1:
Кажется, [OperationBehavior(TransactionScopeRequired=true)]
фиксирует транзакцию до того, как ответ будет отправлен клиенту, и поэтому не может быть использован для отката, если клиент не получил ответ.
Обновление 2:
Чтобы еще раз четко заявить, у меня нет необходимости каким-либо образом взаимодействовать с клиентской стороной. Клиент не должен знать о транзакции, иметь возможность отменить или зафиксировать ее, и никакая транзакция не должна проходить через привязку. Место только , для которого я хочу выполнить откат транзакции, находится на стороне сервера, если транспортный канал не может доставить сообщение получающему клиенту. В случае TCP / IP эта информация должна быть легко доступна для сервера. (ACK пакета TCP не отправляется обратно клиенту)
Таким образом, гипотетический поток выполнения на стороне сервера (обратите внимание на отсутствие на стороне клиента) должен быть:
Receive client request
Start transaction
Execute all logic inside the service operation
Send reply back to client
if (reply.failedToReceive) { transaction.Rollback() } // due to a failing TCP/IP transmission