MVC EF 并发处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhulongxi/article/details/71082153

当同人在同一时刻同时修改数据库中同一笔记录的时候,会出现冲突,有三种方式处理:

1.保留最后一个修改的人的记录,即,不处理冲突。

2.使用悲观锁:

    在更新数据之前,第一个用户将锁住他正在修改的记录,然后进行修改,其他用户保持等待直到锁释放。

3.使用乐观锁:

    当用户提交修改的时候首先判断是否有人已经更新过了同一笔记录,如果没有人更改过,则直接提交,如果已经有人更改过,则修改将会失败,此时用户可以决定如何来处理这个冲突,比如覆盖之前的修改,或不执行自己的修改,或i刷新数据,然后执行自己的修改。

    乐观锁有两种方式:

一、为表中某个数据列设置并发模式:Currency Mode:Fixed.

在edmx文件中,为UnitPrice列设置Concurrency Mode 为Fixed.


        static void Main(string[] args)
        {
            NorthwindEntities NWEntities;
            NWEntities = new TestLINQToEntitiesApp.NorthwindEntities();

            Console.WriteLine("First User ...");
            var product = (from p in NWEntities.Products where p.ProductID == 2 select p).First();
            Console.WriteLine("Original price: {0}", product.UnitPrice);
            product.UnitPrice += 1.0m;
            Console.WriteLine("Current price to update: {0}", product.UnitPrice);

            Console.WriteLine("\nSecond User ...");
            using (NorthwindEntities1 NWEntities1 = new NorthwindEntities1())
            {
                Product1 product1 = (from p in NWEntities1.Product1 where p.ProductID == 2 select p).First();
                Console.WriteLine("Original price: {0}", product1.UnitPrice);
                product1.UnitPrice += 2.0m; Console.WriteLine("Current price to update: {0}", product1.UnitPrice);
                NWEntities1.SaveChanges();
                Console.WriteLine("Price update submitted to database");
            }
            // first user is ready to submit changes   
            Console.WriteLine("\nFirst User ...");
            try
            {
                NWEntities.SaveChanges();
                Console.WriteLine("Price update submitted to database");
            }
            catch (DbUpdateConcurrencyException e)
            {
                Console.WriteLine("Conflicts detected. Refreshing ...");
                var entry = e.Entries.Single();
                entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                NWEntities.SaveChanges();
                Console.WriteLine("Price update submitted to database after refresh");
            }
        }
则NWEntities的修改将覆盖NWEntities1的修改。

二、增加一列version列:

然后在demx文件中为RowVersion列设置Concurrency Mode 为fixed.


没有更多推荐了,返回首页