Я открываю службу 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