2017-05-07 101 views
-1

我有2个系统可以通过API相互通信。 这里是我的代码 系统A:Web API:使用事务(实体框架)时的多线程

using (var transaction = new TransactionScope()) 
{ 
    var myBook = _bookRepository.Table.FirstOrDefault(x => x.Id == request.bookID); 
    myBook.AssigneeId = null; 
    _bookRepository.Update(ticket); 
    var result = await _anotherBApi.ApproveBookAsync(request.bookID);   
    if (result.ShStatus != ResponseStatus.Success) 
    { 
     result.ErrorType = ErrorType.Error; 
     return result; 
    } 
    transaction.Complete(); 
} 

功能ApproveBookAsync(request.bookID)会打电话给B系的API。处理后,B系统回电一个系统的API来更新书籍的信息(上面的一样)。

上面我的代码。我不能transaction.Complete();,因为当B系统调用系统的API时,它会创建新的事务。

期待:我想处理步步为:

  1. 更新Book实例的新信息(试样ID = 1)
  2. 呼叫到B系统的API(B之后系统也呼吁系统A更新Book ID = 1)
  3. 当呼叫B系统失败时,我想要先回滚所有更改。如果成功,承诺。

回答

0

当使用异步/等待中TransactionScope块,你需要选择你需要的交易流动翻过螺纹延续这样的:

using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) 
{ 
    // Your code that contains some calls to async method. 
    transaction.Complete(); 
} 
+0

我是与纠正这将无法工作在不同的流程? – NtFreX