我有多個控制檯應用程序,但他們會讀取和插入更新相同的sql表。我使用了transactionscope,但是我收到了這個錯誤 「事務(進程ID)與另一個進程在鎖資源上死鎖,並且被選爲死鎖受害者,重新運行事務。多個控制檯應用程序使用EF objectcontext更新相同的sql表格
我在catch塊中得到一個異常。我怎樣才能避免這種情況? 我知道問題是什麼,但我不確定應該採取什麼樣的解決方案。我在不同的論壇上看到很多問題,但他們都沒有幫助我。
在我的代碼中,一切都很好嗎?
bool isMaster = false;
tourneyInstanceTrackerId = 0;
using (JG_RummyEntities dbContext = new JG_RummyEntities())
{
try
{
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required,new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead }))
{
bool isAnyMaster = dbContext.TourneyInstanceTrackers.Any(t => t.IsMaster & t.TournamentId == tournamentId);
TourneyInstanceTracker tourneyInstanceTracker = new TourneyInstanceTracker
{
TournamentId = tournamentId,
IsMaster = !isAnyMaster,
CreateDate = DateTime.Now
};
dbContext.AddToTourneyInstanceTrackers(tourneyInstanceTracker);
dbContext.SaveChanges();
var result = dbContext.TourneyInstanceTrackers.Where(t => t.TournamentId == tournamentId)
.OrderByDescending(t => t.CreateDate)
.Select(t => new { t.IsMaster, t.Id })
.FirstOrDefault();
if (result != null)
{
isMaster = result.IsMaster;
tourneyInstanceTrackerId = result.Id;
}
transaction.Complete();
}
}
catch (Exception ex)
{
Logger.Log("Got exception in SetTournamentInTourneyInstanceTracker : " + ex.Message + ", " + ex.StackTrace + ", "+ tournamentId);
}
}
感謝您的回覆。我將IsolationLevel更改爲Serializable,但這也沒有幫助。這是我得到的錯誤,從商店提供商的數據閱讀器讀取時發生錯誤。有關詳細信息,請參閱內部異常。在System.Data.Common.Internal.Materialization.Shaper'1.StoreRead()。我在互聯網上檢查確實是同樣的錯誤。只是FYI我的SQL表只有4列一個是ID是IDENTITY(1,1)的主鍵,其他三個是bigint類型。 – user1955255
您需要查看內部異常以找出錯誤的原因。 –
正如我所說的那樣,error.System.Data.SqlClient.SqlException(0x80131904)。事務(進程ID 293)在另一個進程的鎖資源上死鎖,並被選爲死鎖受害者。重新運行交易。 – user1955255