在 C# 异步代码中使用 MongoDB ClientSessions & Transactions 是否安全?

Bin*_*ier 5 c# session transactions async-await mongodb-.net-driver

从文档读取隔离一致性 - 会话强调我的

为了提供因果一致性,MongoDB 3.6 在客户端会话中启用了因果一致性。因果一致会话表示相关的读取和确认写入操作序列具有因果关系,该因果关系由它们的顺序反映出来。应用程序必须确保一次只有一个线程在客户端会话中执行这些操作

来自文档交易 - 交易和会话

事务与会话相关联。也就是说,您为会话启动事务。在任何给定时间,一个会话最多可以有一个打开的事务。

  1. 这是否说使用 async/await 是不安全的,或者至少所有使用会话和事务的任务都应该 - 不知何故 - 在同一线程上执行?

  2. 还是说会话上的每个异步操作都需要完成才能启动另一个?

  3. 还是说可以针对会话运行多个异步操作,但所有这些操作必须在同一线程上运行。

tl;dr
对事务使用 async/await 是否安全?如果没有,这里的最佳做法是什么?

例如,这是(公认的可怕代码)好吗?

[HttpPost]
public async Task<IActionResult> PostAsync(CreateRequest createRequest)
{
    using (var session = await _client.StartSessionAsync())
    {
        await session.StartTransactionAsync();

        var inserts = new Task[] {
            _colHomer.InsertOneAsync(session, createRequest.Homer),
            _colMarge.InsertOneAsync(session, createRequest.Marge),
            _colBart.InsertOneAsync(session, createRequest.Bart)
        };

        await Task.WhenAll(inserts);

        await session.CommitTransactionAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

dod*_*odo 2

事务和会话被设计为非线程安全的。我认为上面的代码可以工作,但不能保证所有情况。 更新:但是,以常规异步方式使用会话/事务肯定是可以节省的(没有任何手动任务等待和类似的逻辑)。