当我对控制器进行POST时,我间歇地得到线程错误 - 尽管很多时候一切都会完美运行。这些是最常见的两个:
不允许使用新事务,因为会话中还有其他线程在运行。
无法执行事务操作,因为存在处理此事务的待处理请求。
我已阅读多篇回复,说明为何会发生这种情况。例如this one和this one,但我不能说我理解。我知道发布代码是非常糟糕的做法,而且我通常会尽力避免它,但我真的不知道该问什么过去“如果你看到任何明显的问题,请你看看并告诉我。 “
textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1.0f));
注意:我100%确定这与// POST: api/CheckOuts
[AccessType(AccessType.Create)]
[HttpPost, Route("")]
[ResponseType(typeof(CheckOut))]
public async Task<IHttpActionResult> PostCheckOut(TransactionViewModel<CheckOut> tx)
{
//check if tx is a valid CheckOut Model Object
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
tx.Transaction.OrganizationId = SelectedOrganizationID;
tx.Transaction.OfficeId = SelectedOfficeID;
tx.Transaction.CheckedOutById = UserId;
tx.Transaction.Date = DateTime.UtcNow;
var items = tx.Transaction.Items.ToList();
long checkedOutStatus = db.Statuses.First( a => a.Name == "Checked Out" ).Id;
long checkedInStatus = db.Statuses.First( a => a.Name == "Checked In" ).Id;
//check item status
if( !items.TrueForAll( i=> i.StatusId == checkedInStatus ) )
{
return BadRequest("Not all items are in 'Checked In' state.");
}
var mongoItems = GetMongoCollection<BsonDocument>(MongoConstants.ItemsCollection);
items.ForEach(async item =>
{
var builder = Builders<BsonDocument>.Update;
var update = builder.Set("StatusId", checkedOutStatus)
.Set("CustodianId", tx.Transaction.TakenById)
.Set<BsonDocument, int?>("LocationId", null)
.Set<BsonDocument, string>("Location", null);
await mongoItems.FindOneAndUpdateAsync(
Builders<BsonDocument>.Filter.Eq("_id", item.Id),
update);
await AddItemHistory(item, UserId);
var primaryKeyOfTheItemId = db.ItemIds.Single(i => i.Item_Id == item.Id);
tx.Transaction.ItemIds.Add(primaryKeyOfTheItemId);
});
//add item
db.CheckOuts.Add(tx.Transaction);
await db.SaveChangesAsync(UserId);
return CreatedAtRoute("DefaultApi", new {controller = "checkouts", id = tx.Transaction.Id }, tx.Transaction);
}
有关,而且不是MongoDb特有的。下面的代码相当于使用EF将内容保存到SQL。我确信其他Mongo位与这个问题完全无关。
async
await mongoItems.FindOneAndUpdateAsync(
Builders<BsonDocument>.Filter.Eq("_id", item.Id),
update);
是我们的实体框架dbContext(只是与SQL一起使用的普通dbContext,我们有两个数据库--Mongo和SQL)。
答案 0 :(得分:2)
我没有看到你在方法体中创建上下文。实体框架上下文不是线程安全的。