我试图理解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来恢复。好吧,事情是这样的,错误发生了,AbortTransactionAsync被抛出,但是第一个插入根本没有被恢复,如果我检查数据库,我可以看到它仍然存储在那里。
我做错了什么?提前感谢您的帮助!
1条答案
按热度按时间llew8vvj1#
要使transaction工作,您应该将相应的session示例传递给所有期望transaction效果的操作(insert接受session作为输入参数)。