我试图了解 MongoDB 的事务,所以我创建了这个方法来使用它:
public async Task<Item> InsertItem(Item item, string appId)
{
var itemAppCollection = _divitiaeDatabase.GetCollection<Item>(appId);
await itemAppCollection.InsertOneAsync(item);
return item;
}
public async Task TestyInsertItem(Item item, string appId)
{
var sessionOptions = new ClientSessionOptions { CausalConsistency = true };
using (var session = await _divitiaeClient.StartSessionAsync(sessionOptions))
{
session.StartTransaction();
try
{
await InsertItem(item, appId);
await InsertItem(item, appId);
}
catch (Exception ex)
{
await session.AbortTransactionAsync();
throw;
}
}
}
我基本上是通过插入相同的项目两次来强制错误。我想要的是,如果第二个 InsertItem 失败,则应通过抛出 AbortTransactionAsync 来恢复第一个 InsertItem。好吧,问题是发生了错误并抛出了 AbortTransactionAsync,但是第一次插入根本没有恢复,如果我检查数据库,我可以看到它仍然存储在那里。
我在这里做错了什么?预先感谢您的帮助!
要使交易生效,您应该将相应的会话传递给您期望交易生效的所有操作。