Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现。SQL Server timestamp 数据类型与时间和日期无关。SQL Server timestamp 是二进制数字,它表明数据库中数据修改发生的相对顺序。实现 timestamp 数据类型最初是为了支持 SQL Server 恢复算法。每次修改页时,都会使用当前的 @@DBTS 值对其做一次标记,然后 @@DBTS 加1。这样做足以帮助恢复过程确定页修改的相对次序,但是 timestamp 值与时间没有任何关系。 而在MySQL中,TIMESTAMP列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作。如果你有多个TIMESTAMP列,只有第一个自动更新。

在Entity Framework 中采用IsConcurrencyToken配置后RowVersion即自动用于where子句中用于比较Row Version, 我们也需要使用这个特性实现并发控制,Ak.Ini的博文http://www.cnblogs.com/akini/archive/2013/01/30/2882767.html ,我们按照这篇文章的方法在Entity framework core上面解决并发控制问题。

定义的序列号类型:

[Table("DbServerSequence")]
   public  class DbServerSequence : ISequence 
   {

       public DbServerSequence()
       {
           
       }
       public DbServerSequence(SequenceOptions options):this()
       {
           StartAt = options.StartAt;
           CurrentValue = StartAt;
           Increment = options.Increment;
           MaxValue = options.MaxValue;
           MinValue = options.MinValue;
           Cycle = options.Cycle;

       }

       public String Key { get; set; }
       public long StartAt { get;  set; }
       public int Increment { get;  set; }
       public long MaxValue { get;  set; }
       public long MinValue { get;  set; }
       public bool Cycle { get;  set; }
       public long CurrentValue { get; set; }

       [ConcurrencyCheck]
       public DateTime RowVersion { get; set; }

       public DateTime DateCreated { get; set; }
   }
其中RowVersion 是用作并发控制的,针对Mysql 不允许byte[]类型上标记TimeStamp/RowVersion,这里使用DateTime类型。

数据库表定义如下(自MySQL 5.6.5版本开始,DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 选项也可以应用到Datetime类型的列):

DROP TABLE IF EXISTS `dbserversequence`;
CREATE TABLE `dbserversequence` (
  `Key` varchar(128) NOT NULL,
  `StartAt` bigint(20) NOT NULL,
  `Increment` int(11) NOT NULL,
  `MaxValue` bigint(20) NOT NULL,
  `MinValue` bigint(20) NOT NULL,
  `Cycle` bit(1) NOT NULL,
  `CurrentValue` bigint(20) NOT NULL,
  `RowVersion` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `DateCreated` datetime NOT NULL,
  PRIMARY KEY (`Key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在 SequenceDbContext 的OnModelCreating 重写如下,主要是配置并发控制字段:

        protected override void OnModelCreating(ModelBuilder builder)
       {
           base.OnModelCreating(builder);

           builder.Entity<DbServerSequence>(e =>
           {
               e.HasKey(x => x.Key);
               e.Property(x => x.RowVersion).IsRowVersion().IsConcurrencyToken();
           });
       }
这个方案同时适用各种数据库,尤其是类似MySql和Postgresql这种不支持默认RowVersion字段的数据库。 最新的代码放在https://github.com/geffzhang/Sequence/tree/dotnetcore

相关文章:

  • 通用的序列号生成器库

原文地址:http://www.cnblogs.com/shanyou/p/6241612.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mvc.net分页查询案例——PagedList

在.net中&#xff0c;除了人手动写分页类之外&#xff0c;微软还提供了官方的分页&#xff0c;分页工具类包括PagedList和PagerExtension&#xff0c;先来看看PagedList类里面是怎么写的&#xff1a; PagedList using System; using System.Collections.Generic; using Syste…

干货 | Tomcat 连接数与线程池详解

转载自 干货 | Tomcat 连接数与线程池详解 前言 在使用tomcat时&#xff0c;经常会遇到连接数、线程数之类的配置问题&#xff0c;要真正理解这些概念&#xff0c;必须先了解Tomcat的连接器&#xff08;Connector&#xff09;。 在前面的文章 详解Tomcat配置文件server.xml…

cnpm install无反应

cnpm install无反应 推荐使用国内镜像来安装&#xff0c;所以我们先设置 cnpm&#xff1a; npm install -g cnpm --registryhttps://registry.npm.taobao.org 如果安装失败&#xff0c;可以使用npm cache clean清理缓存&#xff0c;然后再重新安装。

120项优化: 超级爬虫Hawk 2.0重磅发布!

沙漠君在历时半年&#xff0c;修改无数bug&#xff0c;更新一票新功能后&#xff0c;在今天隆重推出最新改进的超级爬虫Hawk 2.0! 啥&#xff1f;你不知道Hawk干吗用的&#xff1f; 这是采集数据的挖掘机&#xff0c;网络猎杀的重狙&#xff01;半年多以前&#xff0c;沙漠君写…

github创建一个新的tag

https://git-scm.com/book/en/v2/Git-Basics-Tagging

Java 编程中关于异常处理的 10 个最佳实践

转载自 Java 编程中关于异常处理的 10 个最佳实践 异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求&#xff0c;是为了处理任何错误状况&#xff0c;比如资源不可访问&#xff0c;非法输入&#xff0c;空输入等等。Java提供了几个异常处理特性&…

phone6s home键按不动了怎么办 苹果6s home键按不动解决方法

iphone6s home键按不动了怎么办 苹果6s home键按不动解决方法 作者&#xff1a;佚名 来源&#xff1a;绿茶软件园 2016-02-15 15:53:35 iphone6s home键按不动了怎么办&#xff1f;有iphone用户遇到home键按不动了的问题&#xff0c;下文小乐哥带来苹果6s home键按不动解决方法…

开源库Magicodes.ECharts使用教程

概要 Magicodes.ECharts是心莱团队基于百度EChart封装的开源的.NET类库&#xff0c;以便让用户更快更便捷的上手开发EChart图表。本篇主要讲解Magicodes.ECharts的相关使用。 注意&#xff1a;EChart图表插件是由百度提供的一套前端图表库&#xff0c;可以流畅运行在PC端和移动…

Spring Boot 配置随机数那些小技巧

转载自 Spring Boot 配置随机数那些小技巧 Spring Boot支持在系统加载的时候配置随机数。 添加config/random.properties文件&#xff0c;添加以下内容&#xff1a; #随机32位MD5字符串 user.random.secret${random.value} #随机int数字 user.random.intNumber${rando…

JAVA数组的3种赋值方式

基本数据类型数组的3种赋值方式 第一种赋值方式 int[] arr {1,2,3};第二种赋值方式 int[] arr2 new int[]{1,2,3};第三种赋值方式 int[] arr3 new int[3]; arr3[0] 1; arr3[1] 2; arr3[2] 3;

.NET Core 2.0版本预计于2017年春季发布

微软项目经理Immo Landwerth公布了即将推出的.NET Core 2.0版本的细节&#xff0c;该版本预计于2017年春季发布。这是.NET Core平台的一个重要发布&#xff0c;因为2.0版本对.NET Core的各项功能都有显著扩展。 言归正传&#xff0c;我们来看看即将发布的.NET Core 1.0版本。按…

我是一棵“树”

转载自 我是一棵“树” 我是一颗树&#xff0c;之前我们数据结构家族中的一个小朋友——“栈” 已经给你们介绍过的我们这个家族了&#xff08;我是一个“栈”&#xff09;。之所以叫栈为小朋友&#xff0c;是因为我和他的爸爸——数组是平辈的。 之所以存在我们这样一个家庭&…

pycharm前进、后退快捷键

https://blog.csdn.net/jamieblue1/article/details/89087064 pycharm前进、后退快捷键 jamieblue1 2019-04-08 13:45:17 13663 收藏 4 分类专栏&#xff1a; 其他 文章标签&#xff1a; python pycharm 版权 前进/回退到上一个操作的地方win&#xff1a; 后退 ctrlalt&l…

mvc.net分页查询案例——实体层(HouseModel.cs)

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.ComponentModel;namespace HouseSys.Models {[Serializable]public class HouseModel{[DisplayName("房屋编号")]public int HouseId { get; set; }[DisplayNam…

判断字符串相等能否用==

为什么呢&#xff1f; 是因为比较的是两个对象的内存地址&#xff0c;我们知道变量被创建的时候就相当于在内存中开辟空间&#xff0c;而案例中str和str1就是占用的两块不同的空间&#xff0c;所以他们的内存地址是不一致的&#xff0c;在用符号判断的时候就不相等了&#xff0…

初识分布式系统

转载自 初识分布式系统 随着大型网站的各种高并发访问、海量数据处理等场景越来越多&#xff0c;如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题&#xff0c;大型网站的架构也在不断发展。提高大型网站的高可用架构&#xff0c;不…

数据库 wifi探针数据量太大了

https://www.cnblogs.com/showcase/p/11654045.html https://www.cnblogs.com/showcase/p/11654045.html 橱窗外的小孩 在完成任务的同时&#xff0c;还需要不断“复盘”&#xff0c;不论你多么的忙&#xff0c;都需要留下时间思考&#xff0c;可以思考哪些地方做的好&#x…

CoreCLR源码探索(一) Object是什么

.Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object&#xff0c;他可能会信誓旦旦的告诉你"Object还不简单吗&#xff0c;就是所有类型的基类"这个答案是对的&#xff0c;但是不足以说明Object真正是什么 在这篇文章我们将会通过阅读CoreCLR的…