PDA

View Full Version : سوال: خطا در هنگام استفاده از TransactionScope در بعضی مواقع



hastiam
یک شنبه 08 تیر 1393, 15:33 عصر
سلام دوستان
من به یک مشکل بزرگی برخوردم و اون هم اینه که تو یکی از page هام از TransactionScope استفاده کردم تا اگه مشکلی در ثبت اطلاعات به وجود اومد همه عملیات متوقف بشه. که برنامه درست کار می کنه اما مثلا 4 یا 5 تا رکورد پشت سر هم ثبت میشه یکدفعه برنامه کند میشه و بعضی مواقع از کار میفته و وقتی یکبار صفحه رو رفرش میکنم درست میشه.
هنگام کند شدن خطای زیر مشاهده میشه
Transaction (Process ID 112) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction
و بعد از این ،خطای TransactionTimeout میده.
اگه میشه لطف کنید راهنمایی کنید دلیل به وجود اومدن این خطاها چیه؟

nice_boy_a
دوشنبه 09 تیر 1393, 10:12 صبح
سلام.
میگه که تراکنش به بن بست رسیده! دقیقا بگو داری چیکار میکنی که منابع سیستمو اینجوری داغون کردی که به بن بست رسیده !؟
کدتو بزار ببینم چی نوشتی ؟

hastiam
دوشنبه 09 تیر 1393, 11:37 صبح
کدتو بزار ببینم چی نوشتی ؟



TransactionScope scope = new TransactionScope();
try
{
var getStockTransferDetails = transferDetailRepository.StockTransferDetails.Wher e(i => i.ProductionRelationId == existingItem.ProductionRelationId && i.GoodsID == existingItem.GoodsID).FirstOrDefault();
if (getStockTransferDetails != null)
{
decimal sum = InventoryHelper.GetGoodsInvetory(existingItem.Good sID, getStockTransferDetails.Details.WarehouseId);


if (warehouseReceiptDetails.ApprovedQuantity > sum)
{
result.Successfull = false;
result.Message = "موجودی انبار به اندازه مقدار تاییدی نیست بنابراین این رسید قابل تایید نمی باشد";
return Json(result);
}



string errorMessage = "";
using (scope)
{
WarehouseReceiptServices.CheckDetailsForInspection (existingItem, out errorMessage);
var findInspection = inspectionRepository.GoodsQualityInspections.Where (i => i.WarehouseReceiptDetailID == existingItem.ID).FirstOrDefault();


//ویرایش بازرسی آزمون
if (findInspection != null)
{
existingItem.Quantity = warehouseReceiptDetails.ApprovedQuantity;
findInspection.Quantity = existingItem.Quantity;
findInspection.Updated = DateTime.Now;
findInspection.UpdatedBy = User.Identity.Name;
inspectionRepository.Update(findInspection);
}
else
{
existingItem.ApprovedQuantity = warehouseReceiptDetails.ApprovedQuantity;
}


//ویرایش رسید انبار
existingItem.Updated = DateTime.Now;
existingItem.UpdatedBy = User.Identity.Name;
existingItem.Comment = warehouseReceiptDetails.Comment;
existingItem.FinancialApproved = true;
receiptDetailsRepository.Update(existingItem);


//ویرایش حواله انبار
getStockTransferDetails.ApproveQuantity = warehouseReceiptDetails.ApprovedQuantity;
getStockTransferDetails.Deliver = true;
getStockTransferDetails.DeliverBy = User.Identity.Name;
getStockTransferDetails.DeliveryDate = DateTime.Now;
getStockTransferDetails.TracingNum = (warehouseReceiptDetails.BatchNumber).ToString();
getStockTransferDetails.Updated = DateTime.Now;
getStockTransferDetails.UpdatedBy = User.Identity.Name;
getStockTransferDetails.Comment = warehouseReceiptDetails.Comment;
transferDetailRepository.Update(getStockTransferDe tails);


scope.Complete();
}
}
else
{
result.Successfull = false;
result.Message = "خطا : حواله ای برای رسید انتخاب شده وجود ندارد";
}

result.Message = "";
return Json(result);
}
catch (Exception ex)
{
scope.Dispose();
if (ex.InnerException.InnerException.GetType() == typeof(SqlException))
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
result.Successfull = false;
result.Message = ExceptionLogger.ExceptionMessage(((SqlException)ex .InnerException.InnerException).Number);
}
else
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
result.Successfull = false;
result.Message = ex.Message;
}
}
return Json(result);

hastiam
سه شنبه 10 تیر 1393, 13:29 عصر
کسی نیست که یه راه حل بده؟!!! :افسرده::افسرده::افسرده: برنامه چند ماه شاید نزدیک به یک ساله که داره کار می کنه و هیچ مشکلی نداشت الان تقریبا یک هفته هست که این مشکل رو داره. :گریه::گریه::گریه: