【发布时间】:2019-09-16 01:59:03
【问题描述】:
我需要使用 mongodb 事务更新多个文档,mongodb 社区服务器版本是 4.08,.net 的 mongodb 驱动程序是 2.9 beta(也尝试过 2.8)。通过调试,我可以看到它执行了'session.AbortTransaction();',但数据仍然被插入。
var client = new MongoClient(_config.GetConnectionString(ProductMongoDBContext.DATABASE_CONNECTION_STRING));
var session = client.StartSession();
try
{
session.StartTransaction();
//var database = session.Client.GetDatabase(ProductMongoDBContext.DATABASE_NAME);
var orders = session.Client.GetDatabase(ProductMongoDBContext.DATABASE_NAME).GetCollection<DALOrder>(ProductMongoDBContext.TABLE_NAME_ORDER);
var products = session.Client.GetDatabase(ProductMongoDBContext.DATABASE_NAME).GetCollection<DALProduct>(ProductMongoDBContext.TABLE_NAME_PRODUCT);
DateTime dtNow = DateTime.Now.ToUniversalTime();
await orders.InsertOneAsync(new DALOrder
{
ID = order.ID,
ProductID = Guid.Parse(order.ProductID),
Size = order.Size,
Taste = order.Taste,
TextOnCake = order.TextOnCake,
Consignee = order.Consignee,
ConsigneeAddress = order.ConsigneeAddress,
ConsigneePhone = order.ConsigneePhone,
DeliveryTime = order.DeliveryTime.ToUniversalTime(),
DeliveryWay = order.DeliveryWay,
OrderDepartment = order.OrderDepartment,
Remarks = order.Remarks,
State = OrderState.New.ToString(),
CreatedTime = dtNow,
UpdatedTime = dtNow
});
// After order created, decrease product inventory by one
var productInfo = products.Find<DALProduct>(p => p.ID.ToString().Equals(order.ProductID)).FirstOrDefault();
productInfo.Inventory -= 1;
await products.ReplaceOneAsync<DALProduct>(p => p.ID.ToString().Equals(order.ProductID), productInfo);
session.CommitTransaction();
return true;
}
catch (Exception e)
{
session.AbortTransaction();
order.Message = e.Message;
}
预计插入的订单数据可以回滚,实际结果是数据已经插入db。
顺便说一句,错误发生在
var productInfo = products.Find<DALProduct>(p => p.ID.ToString().Equals(order.ProductID)).FirstOrDefault();
I define ID as GUID in model like below
[BsonId]
public Guid ID { get; set; }
它会抛出像"{document}{_id}.ToString() is not supported."这样的异常
如何避免这种情况
【问题讨论】:
-
正如 Wan 在下面指出的,您需要将会话传递给每个操作。如果您不想这样做,JohnKnoop.MongoRepository 提供了一个抽象,可以自动加入当前事务:github.com/johnknoop/MongoRepository#transactions
标签: c# mongodb transactions mongodb-.net-driver