none
Few processes working on same table with Entity Framework fail with deadlock RRS feed

  • Question

  • Hello,

    I have few threads running that may access for same table for different data filtered inside query (Linq).

    Once process T1 starts to read data in the table, process T2 need to have rows added to the same table, everythin failes with dealock. Why??? How can i solve this?

    Both processes work on same table but with different rows. Seems like EF4.1 places some lock when i start processing and second thread can not access this table to add any data..

    Thanks for your help!

    Friday, March 16, 2012 3:16 PM

Answers

  • Again, it's about setting "No Lock" so there are no deadlocks on a
    table. With EF and its T-SQL engine to generate the T-SQL, it is not
    going to create the T-SQL to use with a "No Lock" condition.
     
    <copied>
     
    NOLOCK
     
    Using NOLOCK politely asks SQL Server to ignore locks and read directly
    from the tables. This means you completely circumvent the lock system,
    which is a major performance and scalability improvement. However, you
    also completely circumvent the lock system, which means your code is
    living dangerously. You might read the not-necessarily-valid uncommitted
    modifications of a running transaction. This is a calculated risk.
     
    <end copy>
     
    If you were using dynamic T-SQL in code or a sproc, you could issue the
    "No Lock" on the table. But you are using EF and its T-SQL generator is
    not going to put the "No Lock" in the generated T-SQL.
     
    Therefore, you must turn to the System.Transaction namespace and use it
    to tell SQL Server to not lock the table "No Lock".
     
    System.Transaction.IsolationLevel.ReadUncommitted is the equivalent to
    using "No Lock" in T-SQL.
     
    If you are doing a read, update, insert or delete and using EF, then the
    ReadUcommitted transaction scope must be used, if you don't want the
    "lock" on the table. It must be used everywhere in the code when doing
    something with the database to remove the locks. If you had one part of
    the code that was using the ReadUncommitted and you had other code that
    was not using ReadUncommitted, then the application is going to be
    aborted. It knows that every interaction with the database no matter if
    it's read, insert, update or delete, it must be using a ReadUncommited
    transaction scope.
             public tblUserCoP GetCopByID(Int32 ID)
            {
                var cacheKey = ID + ":KN.Tiers.Community.DAL.GetCopByID";
                var cacheValue = mDataCache[cacheKey];
                if (cacheValue == null)
                {
                    var cop = new tblUserCoP();
                     //set it to read uncommited
                    var transactionOptions = new TransactionOptions
                                                 {
                                                     IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                                                 };
                     //create the transaction scope, passing our options in
                    using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                    using (var conn = new EntityConnection(mwdb))
                    using (var db = new MainWebDBEntities1(conn))
                    {
                        try
                        {
                            var hit =  compiledQueryCoP.Invoke(db, ID);
                             if (hit != null)
                            {
                                cop = hit;
                            }
                             transactionScope.Complete();
                         }
                        finally
                        {
                            conn.Close();
                        }
                     }
                     cacheValue = cop;
                    mDataCache.Insert(cacheKey, cacheValue,
    DateTime.Now.AddSeconds(5));
                }
                return (tblUserCoP)cacheValue;
            }
     
    Friday, March 16, 2012 5:48 PM

All replies

  • On 3/16/2012 11:16 AM, Wanderer20019 wrote:
    > Hello,
    >
    > I have few threads running that may access for same table for different
    > data filtered inside query (Linq).
    >
    > Once process T1 starts to read data in the table, process T2 need to
    > have rows added to the same table, everythin failes with dealock. Why???
    > How can i solve this?
    >
    > Both processes work on same table but with different rows. Seems like
    > EF4.1 places some lock when i start processing and second thread can not
    > access this table to add any data..
    >
     I am going to show full methods in the CoP class one for reading the
    tblCop table and one for updating the tblCop table by a multi-user Web
    application.
     
    The point being made is about System.Transaction and the Read
    Uncommitted scope, which you must use to stop the lock, and it is the
    equivalent to using "No Lock" in T-SQL.
     
     
    You start using System.Transactions "Read Uncommitted", then all aspects
    of your code for CRUD operations (Create, Read, Update and Delete) must
    be using n the transaction.
     
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Objects;
    using System.Linq;
    using System.Transactions;
    using System.Data.SqlClient;
    using System.Data.EntityClient;
    using KN.Core.App.Cache;
    using KN.Tiers.App.BLL.Configuration;
    using KN.Tiers.Community.DAL.Model;
              public tblUserCoP GetCopByID(Int32 ID)
             {
                 var cacheKey = ID + ":KN.Tiers.Community.DAL.GetCopByID";
                 var cacheValue = mDataCache[cacheKey];
                 if (cacheValue == null)
                 {
                     var cop = new tblUserCoP();
                      //set it to read uncommited
                     var transactionOptions = new TransactionOptions
                                                  {
                                                      IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                                                  };
                      //create the transaction scope, passing our options in
                     using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                     using (var conn = new EntityConnection(mwdb))
                     using (var db = new MainWebDBEntities1(conn))
                     {
                         try
                         {
                             var hit =  compiledQueryCoP.Invoke(db, ID);
                              if (hit != null)
                             {
                                 cop = hit;
                             }
                              transactionScope.Complete();
                          }
                         finally
                         {
                             conn.Close();
                         }
                      }
                      cacheValue = cop;
                     mDataCache.Insert(cacheKey, cacheValue,
    DateTime.Now.AddSeconds(5));
                 }
                 return (tblUserCoP)cacheValue;
             }
        public void UpdateCoP(tblUserCoP cop, List<DTO.DTOKnowArea> kas,
    List<DTO.DTONeighborhood> nbs,
                                    List<DTO.DTOModule> mds,
    List<DTO.DTOWExKnowArea> was,
                                    List<DTO.DTOOwner> ows, DTO.DTOMetric
    met, DTO.DTOGraphic gph)
            {
                 //set it to read uncommited
                var transactionOptions = new TransactionOptions
                {
                      IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                };
                 //create the transaction scope, passing our options in
                using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                using (var conn = new EntityConnection(mwdb))
                using (var db = new MainWebDBEntities1(conn))
                using (var db1 = new MainWebDBEntities1(conn))
                using (var db2 = new MainWebDBEntities1(conn))
                using (var db3 = new MainWebDBEntities1(conn))
                using (var db4 = new MainWebDBEntities1(conn))
                using (var db5 = new MainWebDBEntities1(conn))
                using (var db6 = new MainWebDBEntities1(conn))
                using (var db7 = new MainWebDBEntities1(conn))
                 try
                {
                    var cophit =  compiledQueryCoP.Invoke(db, cop.ID);
                     if (cophit != null)
                    {
                        cophit.CoPTypeID = cop.CoPTypeID;
                        cophit.UserCoPUrlID = cop.UserCoPUrlID;
                        cophit.fdRootFilter = cop.fdRootFilter;
                        cophit.DisplayCoPName = cop.DisplayCoPName;
                         cophit.HomePage =
    GetHomePageURL((Int32)cop.UserCoPUrlID);
                        cophit.HomePage = cophit.HomePage + "?Filter=" +
    cophit.CoP;
                         cophit.Overview = cop.Overview;
                        cophit.CoPText1 = cop.CoPText1;
                        cophit.CoPText2 = cop.CoPText2;
                        cophit.CoPText3 = cop.CoPText3;
                        cophit.CoPText4 = cop.CoPText4;
                        cophit.CoPKeywords = cop.CoPKeywords;
                        cophit.RegLocation = cop.RegLocation;
                        cophit.Justification = cop.Justification;
                        cophit.CoPText5 = cop.CoPText5;
                        cophit.TimeZoneID = cop.TimeZoneID;
                        cophit.DelComment = cop.DelComment;
                         if (cop.DelRvwDate != Convert.ToDateTime("01/01/0001"))
                            cophit.DelRvwDate = cop.DelRvwDate;
                         cophit.WExLocation = cop.WExLocation;
                        cophit.DocMgtDisplayName = cop.DocMgtDisplayName;
                        cophit.CalendarSchedule = cop.CalendarSchedule;
                        cophit.ShortURLName = cop.ShortURLName;
                        cophit.QuestColPostion = cop.QuestColPostion;
                        cophit.VoteColPosition = cop.VoteColPosition;
                        cophit.RetainUsers = cop.RetainUsers;
                        cophit.HeaderLogo = cop.HeaderLogo;
                        cophit.DirBlogTitle = cop.DirBlogTitle;
                        cophit.DirBlogForumID = cop.DirBlogForumID;
                        cophit.DirBlogAllowed = cop.DirBlogAllowed;
                        cophit.SecPriBanner = cop.SecPriBanner;
                        cophit.VSE_KAVersion = cop.VSE_KAVersion;
                        cophit.PromoteMembership = cop.PromoteMembership;
                        cophit.OwnerComments = cop.OwnerComments;
                        cophit.AssignedTo = cop.AssignedTo;
                        cophit.Status = cop.Status;
                         db.SaveChanges();
                         //knowledgeareas
                         if (kas.Count > 0)
                        {
                            foreach (var knowarea in kas)
                            {
                                Int32 kaid = knowarea.KNAreaID;
                                 if (knowarea.Selected)
                                {
                                    var cknahit =
    compiledQueryCoPKnowAreas.Invoke(db1, cop.ID, kaid);
                                     if (cknahit == null)
                                    {
                                        var ckna = new tblUserCoPKnowAreas()
                                        {
                                            CoPID = cop.ID,
                                            KnowAreaID = knowarea.KNAreaID
                                        };
                                         db1.AddTotblUserCoPKnowAreas(ckna);
                                        db1.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var cknahit =
    compiledQueryCoPKnowAreas.Invoke(db1, cop.ID, kaid);
                                     if (cknahit != null)
                                    {
                                        db1.DeleteObject(cknahit);
                                        db1.SaveChanges();
                                    }
                                }
                            }
                        }
                         //neighborhoods
                         if (nbs.Count > 0)
                        {
                            foreach (var nehghborhood in nbs)
                            {
                                Int32 nbid = nehghborhood.NeighborhoodID;
                                 if (nehghborhood.Selected)
                                {
                                    var nbhhit =
    compiledQueryCoPNeighborhoods.Invoke(db2, cop.ID, nbid);
                                     if (nbhhit == null)
                                    {
                                        var nbh = new Model.CoP_Neighborhoods()
                                        {
                                            CoPID = cop.ID,
                                            NeighborhoodID =
    nehghborhood.NeighborhoodID
                                        };
                                         db2.AddToCoP_Neighborhoods(nbh);
                                        db2.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var nbhhit =
    compiledQueryCoPNeighborhoods.Invoke(db2, cop.ID, nbid);
                                     if (nbhhit != null)
                                    {
                                        db2.DeleteObject(nbhhit);
                                        db2.SaveChanges();
                                    }
                                }
                            }
                        }
                         //modules
                         if (mds.Count > 0)
                        {
                            foreach (var module in mds)
                            {
                                Int32 modid = module.ModuleID;
                                 if (module.Selected)
                                {
                                    var modhit =
    compiledQueryCoPModule.Invoke(db3, cop.ID, modid);
                                     if (modhit == null)
                                    {
                                        var mod = new tblUserCoPModule()
                                        {
                                            CoPID = cop.ID,
                                            ModuleID = module.ModuleID,
                                            IsRestricted = module.Restricted
                                        };
                                         db3.AddTotblUserCoPModule(mod);
                                        db3.SaveChanges();
                                    }
                                    else
                                    {
                                        modhit.IsRestricted =
    module.Restricted;
                                        db3.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var modhit =
    compiledQueryCoPModule.Invoke(db3, cop.ID, modid);
                                     if (modhit != null)
                                    {
                                        db3.DeleteObject(modhit);
                                        db3.SaveChanges();
                                    }
                                }
                            }
                        }
                         //WeXKnowledgearea
                         if (was.Count > 0)
                        {
                            foreach (var wexka in was)
                            {
                                Int32 waskid = wexka.KNAreaID;
                                 if (wexka.Selected)
                                {
                                    var wexkhit =
    compiledQueryWExKnAreaRel.Invoke(db4, cop.ID, waskid);
                                     if (wexkhit == null)
                                    {
                                        var wexk = new tblWExKnAreaRel()
                                        {
                                            CoPId = cop.ID,
                                            ThisKnAreaId = wexka.KNAreaID
                                        };
                                         db4.AddTotblWExKnAreaRel(wexk);
                                        db4.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var wexkhit =
    compiledQueryWExKnAreaRel.Invoke(db4, cop.ID, waskid);
                                     if (wexkhit != null)
                                    {
                                        db4.DeleteObject(wexkhit);
                                        db4.SaveChanges();
                                    }
                                }
                            }
                        }
                         //Owners
                         if (ows.Count > 0)
                        {
                            foreach (var owner in ows)
                            {
                                Int32 pocid = owner.POCID;
                                 if (owner.IsNew
                                    && !owner.IsDeleted)
                                {
                                    var own = new CoP_Owners()
                                    {
                                        CoPID = cop.ID,
                                        POCID = owner.POCID,
                                        PrimaryOwner = owner.PrimaryOwner,
                                        ReceiveEmail = owner.ReceiveEmail,
                                        DisplayOnCoP = owner.DisplayOnCoP,
                                        DisplayOrder = owner.DisplayOrder
                                     };
                                     db5.AddToCoP_Owners(own);
                                    db5.SaveChanges();
                                }
                                else if (!owner.IsNew
                                        && !owner.IsDeleted)
                                {
                                    var ownerhit =
    compiledQueryCoPOwners.Invoke(db5, cop.ID, pocid);
                                     if (ownerhit != null)
                                    {
                                        ownerhit.PrimaryOwner =
    owner.PrimaryOwner;
                                        ownerhit.ReceiveEmail =
    owner.ReceiveEmail;
                                        ownerhit.DisplayOnCoP =
    owner.DisplayOnCoP;
                                        ownerhit.DisplayOrder =
    owner.DisplayOrder;
                                         db5.SaveChanges();
                                    }
                                }
                                else if (owner.IsDeleted)
                                {
                                    var ownerhit =
    compiledQueryCoPOwners.Invoke(db5, cop.ID, pocid);
                                     if (ownerhit != null)
                                    {
                                        db5.DeleteObject(ownerhit);
                                        db5.SaveChanges();
                                    }
                                }
                            }
                        }
                         //matadata
                         var matahit = compiledQueryCopMetaData.Invoke(db6,
    cop.ID);
                         if (matahit != null)
                        {
                            if (met.DateCreated !=
    Convert.ToDateTime("01/01/0001"))
                                matahit.DateCreated = met.DateCreated;
                             if (met.DateAssigned !=
    Convert.ToDateTime("01/01/0001"))
                                matahit.DateAssigned = met.DateAssigned;
                             db6.SaveChanges();
                        }
                         //graphic
                         var gphit = (db7.tblUserCoPGraphic.Where(a =>
    a.CoPID == cop.ID)).FirstOrDefault();
                         if (gphit != null)
                        {
                            gphit.ImageSize = gph.ImageSize;
                            gphit.ImageFile = gph.ImageFile;
                             db7.SaveChanges();
                        }
                        else
                        {
                            var gphr = new tblUserCoPGraphic();
                             gphr.CoPID = cop.ID;
                             if (gph.ImageSize != 0)
                                gphr.ImageSize = gph.ImageSize;
                             if (gph.ImageFile != string.Empty)
                                gphr.ImageFile = gph.ImageFile;
                             db7.AddTotblUserCoPGraphic(gphr);
                            db7.SaveChanges();
                        }
                    }
                     transactionScope.Complete();
                }
                finally
                {
                    conn.Close();
                }
            }
     
    Friday, March 16, 2012 4:40 PM
  • On 3/16/2012 11:16 AM, Wanderer20019 wrote:
    > Hello,
    >
    > I have few threads running that may access for same table for different
    > data filtered inside query (Linq).
    >
    > Once process T1 starts to read data in the table, process T2 need to
    > have rows added to the same table, everythin failes with dealock. Why???
    > How can i solve this?
    >
    > Both processes work on same table but with different rows. Seems like
    > EF4.1 places some lock when i start processing and second thread can not
    > access this table to add any data..
    >
     I am going to show full methods in the CoP class one for reading the
    tblCop table and one for updating the tblCop table by a multi-user Web
    application.
     
    The point being made is about System.Transaction and the Read
    Uncommitted scope, which you must use to stop the lock, and it is the
    equivalent to using "No Lock" in T-SQL.
     
     
    You start using System.Transactions "Read Uncommitted", then all aspects
    of your code for CRUD operations (Create, Read, Update and Delete) must
    be using n the transaction.
     
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Objects;
    using System.Linq;
    using System.Transactions;
    using System.Data.SqlClient;
    using System.Data.EntityClient;
    using KN.Core.App.Cache;
    using KN.Tiers.App.BLL.Configuration;
    using KN.Tiers.Community.DAL.Model;
              public tblUserCoP GetCopByID(Int32 ID)
             {
                 var cacheKey = ID + ":KN.Tiers.Community.DAL.GetCopByID";
                 var cacheValue = mDataCache[cacheKey];
                 if (cacheValue == null)
                 {
                     var cop = new tblUserCoP();
                      //set it to read uncommited
                     var transactionOptions = new TransactionOptions
                                                  {
                                                      IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                                                  };
                      //create the transaction scope, passing our options in
                     using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                     using (var conn = new EntityConnection(mwdb))
                     using (var db = new MainWebDBEntities1(conn))
                     {
                         try
                         {
                             var hit =  compiledQueryCoP.Invoke(db, ID);
                              if (hit != null)
                             {
                                 cop = hit;
                             }
                              transactionScope.Complete();
                          }
                         finally
                         {
                             conn.Close();
                         }
                      }
                      cacheValue = cop;
                     mDataCache.Insert(cacheKey, cacheValue,
    DateTime.Now.AddSeconds(5));
                 }
                 return (tblUserCoP)cacheValue;
             }
        public void UpdateCoP(tblUserCoP cop, List<DTO.DTOKnowArea> kas,
    List<DTO.DTONeighborhood> nbs,
                                    List<DTO.DTOModule> mds,
    List<DTO.DTOWExKnowArea> was,
                                    List<DTO.DTOOwner> ows, DTO.DTOMetric
    met, DTO.DTOGraphic gph)
            {
                 //set it to read uncommited
                var transactionOptions = new TransactionOptions
                {
                      IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                };
                 //create the transaction scope, passing our options in
                using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                using (var conn = new EntityConnection(mwdb))
                using (var db = new MainWebDBEntities1(conn))
                using (var db1 = new MainWebDBEntities1(conn))
                using (var db2 = new MainWebDBEntities1(conn))
                using (var db3 = new MainWebDBEntities1(conn))
                using (var db4 = new MainWebDBEntities1(conn))
                using (var db5 = new MainWebDBEntities1(conn))
                using (var db6 = new MainWebDBEntities1(conn))
                using (var db7 = new MainWebDBEntities1(conn))
                 try
                {
                    var cophit =  compiledQueryCoP.Invoke(db, cop.ID);
                     if (cophit != null)
                    {
                        cophit.CoPTypeID = cop.CoPTypeID;
                        cophit.UserCoPUrlID = cop.UserCoPUrlID;
                        cophit.fdRootFilter = cop.fdRootFilter;
                        cophit.DisplayCoPName = cop.DisplayCoPName;
                         cophit.HomePage =
    GetHomePageURL((Int32)cop.UserCoPUrlID);
                        cophit.HomePage = cophit.HomePage + "?Filter=" +
    cophit.CoP;
                         cophit.Overview = cop.Overview;
                        cophit.CoPText1 = cop.CoPText1;
                        cophit.CoPText2 = cop.CoPText2;
                        cophit.CoPText3 = cop.CoPText3;
                        cophit.CoPText4 = cop.CoPText4;
                        cophit.CoPKeywords = cop.CoPKeywords;
                        cophit.RegLocation = cop.RegLocation;
                        cophit.Justification = cop.Justification;
                        cophit.CoPText5 = cop.CoPText5;
                        cophit.TimeZoneID = cop.TimeZoneID;
                        cophit.DelComment = cop.DelComment;
                         if (cop.DelRvwDate != Convert.ToDateTime("01/01/0001"))
                            cophit.DelRvwDate = cop.DelRvwDate;
                         cophit.WExLocation = cop.WExLocation;
                        cophit.DocMgtDisplayName = cop.DocMgtDisplayName;
                        cophit.CalendarSchedule = cop.CalendarSchedule;
                        cophit.ShortURLName = cop.ShortURLName;
                        cophit.QuestColPostion = cop.QuestColPostion;
                        cophit.VoteColPosition = cop.VoteColPosition;
                        cophit.RetainUsers = cop.RetainUsers;
                        cophit.HeaderLogo = cop.HeaderLogo;
                        cophit.DirBlogTitle = cop.DirBlogTitle;
                        cophit.DirBlogForumID = cop.DirBlogForumID;
                        cophit.DirBlogAllowed = cop.DirBlogAllowed;
                        cophit.SecPriBanner = cop.SecPriBanner;
                        cophit.VSE_KAVersion = cop.VSE_KAVersion;
                        cophit.PromoteMembership = cop.PromoteMembership;
                        cophit.OwnerComments = cop.OwnerComments;
                        cophit.AssignedTo = cop.AssignedTo;
                        cophit.Status = cop.Status;
                         db.SaveChanges();
                         //knowledgeareas
                         if (kas.Count > 0)
                        {
                            foreach (var knowarea in kas)
                            {
                                Int32 kaid = knowarea.KNAreaID;
                                 if (knowarea.Selected)
                                {
                                    var cknahit =
    compiledQueryCoPKnowAreas.Invoke(db1, cop.ID, kaid);
                                     if (cknahit == null)
                                    {
                                        var ckna = new tblUserCoPKnowAreas()
                                        {
                                            CoPID = cop.ID,
                                            KnowAreaID = knowarea.KNAreaID
                                        };
                                         db1.AddTotblUserCoPKnowAreas(ckna);
                                        db1.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var cknahit =
    compiledQueryCoPKnowAreas.Invoke(db1, cop.ID, kaid);
                                     if (cknahit != null)
                                    {
                                        db1.DeleteObject(cknahit);
                                        db1.SaveChanges();
                                    }
                                }
                            }
                        }
                         //neighborhoods
                         if (nbs.Count > 0)
                        {
                            foreach (var nehghborhood in nbs)
                            {
                                Int32 nbid = nehghborhood.NeighborhoodID;
                                 if (nehghborhood.Selected)
                                {
                                    var nbhhit =
    compiledQueryCoPNeighborhoods.Invoke(db2, cop.ID, nbid);
                                     if (nbhhit == null)
                                    {
                                        var nbh = new Model.CoP_Neighborhoods()
                                        {
                                            CoPID = cop.ID,
                                            NeighborhoodID =
    nehghborhood.NeighborhoodID
                                        };
                                         db2.AddToCoP_Neighborhoods(nbh);
                                        db2.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var nbhhit =
    compiledQueryCoPNeighborhoods.Invoke(db2, cop.ID, nbid);
                                     if (nbhhit != null)
                                    {
                                        db2.DeleteObject(nbhhit);
                                        db2.SaveChanges();
                                    }
                                }
                            }
                        }
                         //modules
                         if (mds.Count > 0)
                        {
                            foreach (var module in mds)
                            {
                                Int32 modid = module.ModuleID;
                                 if (module.Selected)
                                {
                                    var modhit =
    compiledQueryCoPModule.Invoke(db3, cop.ID, modid);
                                     if (modhit == null)
                                    {
                                        var mod = new tblUserCoPModule()
                                        {
                                            CoPID = cop.ID,
                                            ModuleID = module.ModuleID,
                                            IsRestricted = module.Restricted
                                        };
                                         db3.AddTotblUserCoPModule(mod);
                                        db3.SaveChanges();
                                    }
                                    else
                                    {
                                        modhit.IsRestricted =
    module.Restricted;
                                        db3.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var modhit =
    compiledQueryCoPModule.Invoke(db3, cop.ID, modid);
                                     if (modhit != null)
                                    {
                                        db3.DeleteObject(modhit);
                                        db3.SaveChanges();
                                    }
                                }
                            }
                        }
                         //WeXKnowledgearea
                         if (was.Count > 0)
                        {
                            foreach (var wexka in was)
                            {
                                Int32 waskid = wexka.KNAreaID;
                                 if (wexka.Selected)
                                {
                                    var wexkhit =
    compiledQueryWExKnAreaRel.Invoke(db4, cop.ID, waskid);
                                     if (wexkhit == null)
                                    {
                                        var wexk = new tblWExKnAreaRel()
                                        {
                                            CoPId = cop.ID,
                                            ThisKnAreaId = wexka.KNAreaID
                                        };
                                         db4.AddTotblWExKnAreaRel(wexk);
                                        db4.SaveChanges();
                                    }
                                }
                                else
                                {
                                    var wexkhit =
    compiledQueryWExKnAreaRel.Invoke(db4, cop.ID, waskid);
                                     if (wexkhit != null)
                                    {
                                        db4.DeleteObject(wexkhit);
                                        db4.SaveChanges();
                                    }
                                }
                            }
                        }
                         //Owners
                         if (ows.Count > 0)
                        {
                            foreach (var owner in ows)
                            {
                                Int32 pocid = owner.POCID;
                                 if (owner.IsNew
                                    && !owner.IsDeleted)
                                {
                                    var own = new CoP_Owners()
                                    {
                                        CoPID = cop.ID,
                                        POCID = owner.POCID,
                                        PrimaryOwner = owner.PrimaryOwner,
                                        ReceiveEmail = owner.ReceiveEmail,
                                        DisplayOnCoP = owner.DisplayOnCoP,
                                        DisplayOrder = owner.DisplayOrder
                                     };
                                     db5.AddToCoP_Owners(own);
                                    db5.SaveChanges();
                                }
                                else if (!owner.IsNew
                                        && !owner.IsDeleted)
                                {
                                    var ownerhit =
    compiledQueryCoPOwners.Invoke(db5, cop.ID, pocid);
                                     if (ownerhit != null)
                                    {
                                        ownerhit.PrimaryOwner =
    owner.PrimaryOwner;
                                        ownerhit.ReceiveEmail =
    owner.ReceiveEmail;
                                        ownerhit.DisplayOnCoP =
    owner.DisplayOnCoP;
                                        ownerhit.DisplayOrder =
    owner.DisplayOrder;
                                         db5.SaveChanges();
                                    }
                                }
                                else if (owner.IsDeleted)
                                {
                                    var ownerhit =
    compiledQueryCoPOwners.Invoke(db5, cop.ID, pocid);
                                     if (ownerhit != null)
                                    {
                                        db5.DeleteObject(ownerhit);
                                        db5.SaveChanges();
                                    }
                                }
                            }
                        }
                         //matadata
                         var matahit = compiledQueryCopMetaData.Invoke(db6,
    cop.ID);
                         if (matahit != null)
                        {
                            if (met.DateCreated !=
    Convert.ToDateTime("01/01/0001"))
                                matahit.DateCreated = met.DateCreated;
                             if (met.DateAssigned !=
    Convert.ToDateTime("01/01/0001"))
                                matahit.DateAssigned = met.DateAssigned;
                             db6.SaveChanges();
                        }
                         //graphic
                         var gphit = (db7.tblUserCoPGraphic.Where(a =>
    a.CoPID == cop.ID)).FirstOrDefault();
                         if (gphit != null)
                        {
                            gphit.ImageSize = gph.ImageSize;
                            gphit.ImageFile = gph.ImageFile;
                             db7.SaveChanges();
                        }
                        else
                        {
                            var gphr = new tblUserCoPGraphic();
                             gphr.CoPID = cop.ID;
                             if (gph.ImageSize != 0)
                                gphr.ImageSize = gph.ImageSize;
                             if (gph.ImageFile != string.Empty)
                                gphr.ImageFile = gph.ImageFile;
                             db7.AddTotblUserCoPGraphic(gphr);
                            db7.SaveChanges();
                        }
                    }
                     transactionScope.Complete();
                }
                finally
                {
                    conn.Close();
                }
            }
     
    Friday, March 16, 2012 4:42 PM
  • Hi,

    Thanks for the post. Its pretty big though and has a lot of really not necessary code for ur particular task. Very hard to understand main point and idea. Could you please write it in compressed variant. Basically i need to understand how it works.

    Here is what i have:

    Process#1:

    for(...){ using(var context=new Context()){ var entity=createNewEntity();

    context.Entities.AddObject(entity);

    context.saveChanges(); }

    }

    And it wors pretty fine. I see new entities appear in table one by one.

    But once process #2 start goin, process 1 stops adding anythin giving deadlock exceptions.

    Process #2:

    using(context=new Context())
    {
    foreach(var entity in context.Entities)
    {
    entity.status="bla bla";
    }
    
    context.saveChanges();
    }

    Even though Entities are same table, both processes work on different rows that i get with .Select(ent=>ent.Status==1).

    Thanks for ur help!


    Friday, March 16, 2012 4:48 PM
  • Again, it's about setting "No Lock" so there are no deadlocks on a
    table. With EF and its T-SQL engine to generate the T-SQL, it is not
    going to create the T-SQL to use with a "No Lock" condition.
     
    <copied>
     
    NOLOCK
     
    Using NOLOCK politely asks SQL Server to ignore locks and read directly
    from the tables. This means you completely circumvent the lock system,
    which is a major performance and scalability improvement. However, you
    also completely circumvent the lock system, which means your code is
    living dangerously. You might read the not-necessarily-valid uncommitted
    modifications of a running transaction. This is a calculated risk.
     
    <end copy>
     
    If you were using dynamic T-SQL in code or a sproc, you could issue the
    "No Lock" on the table. But you are using EF and its T-SQL generator is
    not going to put the "No Lock" in the generated T-SQL.
     
    Therefore, you must turn to the System.Transaction namespace and use it
    to tell SQL Server to not lock the table "No Lock".
     
    System.Transaction.IsolationLevel.ReadUncommitted is the equivalent to
    using "No Lock" in T-SQL.
     
    If you are doing a read, update, insert or delete and using EF, then the
    ReadUcommitted transaction scope must be used, if you don't want the
    "lock" on the table. It must be used everywhere in the code when doing
    something with the database to remove the locks. If you had one part of
    the code that was using the ReadUncommitted and you had other code that
    was not using ReadUncommitted, then the application is going to be
    aborted. It knows that every interaction with the database no matter if
    it's read, insert, update or delete, it must be using a ReadUncommited
    transaction scope.
             public tblUserCoP GetCopByID(Int32 ID)
            {
                var cacheKey = ID + ":KN.Tiers.Community.DAL.GetCopByID";
                var cacheValue = mDataCache[cacheKey];
                if (cacheValue == null)
                {
                    var cop = new tblUserCoP();
                     //set it to read uncommited
                    var transactionOptions = new TransactionOptions
                                                 {
                                                     IsolationLevel =
    System.Transactions.IsolationLevel.ReadUncommitted
                                                 };
                     //create the transaction scope, passing our options in
                    using (var transactionScope = new
    TransactionScope(TransactionScopeOption.Required, transactionOptions))
                    using (var conn = new EntityConnection(mwdb))
                    using (var db = new MainWebDBEntities1(conn))
                    {
                        try
                        {
                            var hit =  compiledQueryCoP.Invoke(db, ID);
                             if (hit != null)
                            {
                                cop = hit;
                            }
                             transactionScope.Complete();
                         }
                        finally
                        {
                            conn.Close();
                        }
                     }
                     cacheValue = cop;
                    mDataCache.Insert(cacheKey, cacheValue,
    DateTime.Now.AddSeconds(5));
                }
                return (tblUserCoP)cacheValue;
            }
     
    Friday, March 16, 2012 5:48 PM