乐观并发

posted at 2020.11.24 14:22 by 风信子

理解乐观并发,需要读懂/*   */之间的论述。

*

数据库并发指多个进程或用户同时访问或更改数据库中的相同数据触发,并发控制指的是发生并发冲突更改时确保数据一致性的特定机制。

并发冲突按照官方解释:当某用户显示实体数据以对其进行编辑,而另一用户在上一用户更改写入数据库之前更新同一实体的数据时,会发生并发冲突,并发要解决的场景是防止数据丢失。

我们通过一个场景来了解它:

*

在大多数系统中并发冲突并不常见。并发分为两种:悲观并发和乐观并发。悲观并发又称悲观锁,在还没有EF CoreORM框架之前,往往会采用传统Ado.Net提供的开发方式,大多数的应用程序为了防止在并发情况下出现数据丢失,会将数据库锁定。具体操作是从数据库读取一条数据之前,将其锁定为只读或更新状态。

而管理这些锁定存在的问题也很明显,编程代码会很复杂,而且它会占用大量的数据库资源,随着用户数的增加还会导致性能问题。

   乐观并发又名开放式并发,也称作乐观锁。它允许多个进程或用户独立进行更改而不产生数据库锁,以节省开销。在理想情况下,这些更改互不干扰,因此能够执行成功。

悲观并发每次读取数据的时候都会加锁,而乐观并发每次读取数据的时候都默认不加锁,只有在更新的时候才判断当前数据有没有更新。

通常乐观锁会通过给数据添加版本号的记录机制实现,适用于多读的应用类型,这样可以提高吞吐量。

接下来我们通过EF Core实现乐观并发:

       1、构建一个Department实体。

    public class Department

    {

        public int DepartmentID { get; set; }

        [StringLength(50, MinimumLength = 3)]

        public string Name { get; set; }

        [DataType(DataType.Currency)]

        [Column(TypeName = "money")]

        public decimal Budget { get; set; }

        [DataType(DataType.Date)]

        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]

        [Display(Name = "成立时间")]

        public DateTime StartDate { get; set; }

 

        [Timestamp]

        public byte[] RowVersion { get; set; }

 

        public int? TeacherID { get; set; }

         public virtual Teacher Administrator { get; set; }

        public virtual ICollection<Course> Courses { get; set; }

} 

       我们为实体添加了Byte类型的Row Version属性,声明了TimeStamp特性。这样同步到SQLServe数据库时会将Row Version的数据类型修改为TimeStamp类型。

      Row Version属性在并发冲突中又被 称为并发令牌或并发标记。Row Version的值是时间戳,它会自动增加。

      2、 添加DepartmentsService。

      3、 建立DepartmentsControl及Index、Edit方法。

      4、 建立Index.cshtml、Edit.cshtml。

      5、打开Edge、Uc浏览器,测试并发情况。假设先在Edge中打开Edit页面,编辑Department实体的数据更改,这时正常更新,然后,接着在 Uc浏览器提交更改,会出现这样错误。

        这样我们就完成了并发控制的演示。 配置并发令牌可以控制乐观并发,每当更新操作时,我们会将数据库上的并发令牌与EF Core中读取的原始值进行比较,如果 Row Version值匹配,则完成操作,否则中止当前事务,最终返回的结果是未影响任何行数据,此时会触发并发冲突,导致EF Core触发DbUpdateConcurrencyException的异常,以此让开发者来解决此冲突。

   相关代码下载 

Tags: , , , ,

IT技术

Add comment

  Country flag

biuquote
微笑得意调皮害羞酷大笑惊讶发呆喜欢可怜尴尬闭嘴噘嘴皱眉伤心抓狂呕吐坏笑漫骂发怒
Loading