zoukankan      html  css  js  c++  java
  • 乐观并发

    乐观并发模式是指乐观的尝试将实体保存到数据库中,以期数据自实体加载后未曾改变。单若数据确实发生了更改,则将引发异常(DbUpdateConcurrencyException ),必须先解决冲突,然后再尝试保存。

    解决乐观并发模式的异常

     static void Main(string[] args)
            {           
                using (var db = new SchoolEntities2())
                {
                    Authors author = db.Authors.Find(1);                
                    Console.WriteLine("name:"+author.Name);
                    db.Entry(author).State = EntityState.Modified;
    
                    try
                    {
                        db.SaveChanges();
                    }
                    catch (DbUpdateConcurrencyException ex)
                    {
                       
                    /*  方式一:使用reload会使用数据库中的当前值覆盖实体中的值(包括当前值与原始值)
                        var entry = ex.Entries.Single();
                        Console.WriteLine("CurrentValues:" + entry.CurrentValues.GetValue<string>("Name"));
                        Console.WriteLine("OriginalValues:" + entry.OriginalValues.GetValue<string>("Name"));
                        entry.Reload();//重新从数据库中获取
                        Console.WriteLine("CurrentValues2:" + entry.CurrentValues.GetValue<string>("Name"));
                        Console.WriteLine("OriginalValues2:" + entry.OriginalValues.GetValue<string>("Name"));
                     */
                        //方式二:可以选择性覆盖实体中的值
                           var entry = ex.Entries.Single();                 
                           Console.WriteLine("CurrentValues:" + entry.CurrentValues.GetValue<string>("Name"));
                           Console.WriteLine("OriginalValues:" + entry.OriginalValues.GetValue<string>("Name"));
                           //将重新从数据库中获取的值保存到当前实体的原始值中
                           entry.OriginalValues.SetValues(entry.GetDatabaseValues());
                         //  entry.CurrentValues.SetValues(entry.GetDatabaseValues());
                           Console.WriteLine("CurrentValues2:" + entry.CurrentValues.GetValue<string>("Name"));
                           Console.WriteLine("OriginalValues2:" + entry.OriginalValues.GetValue<string>("Name"));
                        
                    }
                    catch (Exception ex)
                    { }
                   
                }
    
                Console.ReadLine();
            }
    

    当然也可以使用实体类型的实例执行此操作。可使用 DbPropertyValuesToObjectSetValues 方法实现这一点。例如:

        var entry = ex.Entries.Single(); 
        var databaseValue = entry.GetDatabaseValues();
        var databaseValueAsAuthor = (Authors)databaseValue.ToObject();
        entry.OriginalValues.SetValues(databaseValueAsAuthor);
    

    注意:需要将EF中的并发模式设为Fixed ;EF仅支持乐观并发模式

    乐观并发与悲观并发的区别:悲观并发在修改数据时,其它用户不需进行操作(包括读取),乐观模式可以。

  • 相关阅读:
    冒泡排序的PHP实现 Bubble Sort
    什么是排序算法
    使用memcache 心得和注意事项
    Memcache存储机制与指令汇总
    php中ob缓存机制
    防止php重复提交表单更安全的方法
    Nginx负载均衡配置实例详解
    FAT和EXFAT文件系统
    uCOS-II模拟(VS2010&WIN32)
    MIPS汇编指令集
  • 原文地址:https://www.cnblogs.com/goodlucklzq/p/4670711.html
Copyright © 2011-2022 走看看