Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多个控制台应用程序使用EF objectcontext更新相同的sql表_C#_Sql_Entity Framework_Objectcontext - Fatal编程技术网

C# 多个控制台应用程序使用EF objectcontext更新相同的sql表

C# 多个控制台应用程序使用EF objectcontext更新相同的sql表,c#,sql,entity-framework,objectcontext,C#,Sql,Entity Framework,Objectcontext,我有多个控制台应用程序,但它们将读取和插入更新同一个sql表。我使用了transactionscope,但出现了此错误 “事务(进程ID)在另一个进程的锁资源上被死锁,并被选为死锁受害者。请重新运行该事务。” 我的catch块出现异常。我怎样才能避免这种情况? 我知道问题是什么,但我不确定可能的解决办法是什么。我看到很多问题在不同的论坛上被问到,但没有一个真正帮助了我 我的代码一切都好吗 bool isMaster = false; tourneyInstanceTrackerId = 0; u

我有多个控制台应用程序,但它们将读取和插入更新同一个sql表。我使用了transactionscope,但出现了此错误 “事务(进程ID)在另一个进程的锁资源上被死锁,并被选为死锁受害者。请重新运行该事务。”

我的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.RepeatableRead
的作用类似于一个线程,许多线程可以同时读取一条记录,但一旦有人想要写入,您必须等待所有读卡器完成,然后对该对象进行独占锁定,直到您完成写入

假设你有一个程序,它读取对象“a”等待一段时间,然后写入对象“a”。现在让我们看看当程序的两个副本运行时会发生什么

Program 1 Program 2 --------- --------- Begin Trans Not Started Read A Begin Trans Wait Read A Try Write A Wait Try Write A Try Write A Try Write A Try Write A Try Write A Try Write A
另一种方法是遵循异常的建议,在捕获异常的代码块上,重新运行该函数,直到它通过,而没有另一个程序副本阻止它。

感谢您的回复。我将IsolationLevel更改为Serializable,但这也没有帮助。这是我收到的错误,从存储提供商的数据读取器读取时出错。有关详细信息,请参见内部异常,位于System.Data.Common.Internal.Materialization.Shaper`1.StoreRead()。这和我在网上查到的错误是一样的。仅供参考,我的SQL表只有4列,一列是Id,它是标识为(1,1)的主键,另外三列是bigint类型。您需要查看内部异常以查找错误原因。正如我所说的,这是相同的错误。System.Data.SqlClient.SqlException(0x80131904)。事务(进程ID 293)在另一个进程的锁资源上被死锁,并被选为死锁牺牲品。重新运行事务。除了您在回答中显示的代码之外,其他代码是否使用了
dbContext.TourneyInstanceTrackers
? Program 1 Program 2 --------- --------- Begin Trans Not Started Read A Begin Trans Wait Try Read A Write A Try Read A End Trans Read A Wait Write A End Trans