MVC EF 并发处理

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

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.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值