将通用的序列号生成器库 从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
Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制的更多相关文章
-
Entity Framework Core For MySql查询中使用DateTime.Now的问题
背景 最近一直忙于手上澳洲线上项目的整体迁移和升级的准备工作,导致博客和公众号停更.本周终于艰难的完成了任务,借此机会,总结一下项目中遇到的一些问题. EF Core一直是我们团队中中小型项目常用的O ...
-
Entity Framework Core生成的存储过程在MySQL中需要进行处理及PMC中的常用命令
在使用Entity Framework Core生成MySQL数据库脚本,对于生成的存储过程,在执行的过程中出现错误,需要在存储过程前面添加 delimiter // 附:可以使用Visual Stu ...
-
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...
-
全球首发免费的MySql for Entity Framework Core
from:http://www.1234.sh/post/pomelo-data-mysql?utm_source=tuicool&utm_medium=referral Source 源代码 ...
-
ABP .Net Core Entity Framework迁移使用MySql数据库
一.迁移说明 ABP模板项目Entity Framework Core默认使用的是Sql Server,也很容易将数据库迁移到MySQL,步骤如下. 二.迁移MySQL步骤 1. 下载项目 请到 ht ...
-
Working with Data &#187; Getting started with ASP.NET Core and Entity Framework Core using Visual Studio &#187;迁移
Migrations¶ 4 of 4 people found this helpful The Contoso University sample web application demonstra ...
-
Working with Data &#187; Getting started with ASP.NET Core and Entity Framework Core using Visual Studio &#187; 创建复杂数据模型
Creating a complex data model 创建复杂数据模型 8 of 9 people found this helpful The Contoso University sampl ...
-
Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...
-
在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现
<在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...
随机推荐
-
基于Netty与RabbitMQ的消息服务
Netty作为一个高性能的异步网络开发框架,可以作为各种服务的开发框架. 前段时间的一个项目涉及到硬件设备实时数据的采集,采用Netty作为采集服务的实现框架,同时使用RabbitMQ作为采集服务和各 ...
-
tp文件上传;org/RBAC.class.php 权限类;think/page,class,php分页类;
一.上传表单: 注意,要使用上传功能 你的表单需要设置 enctype="multipart/form-data" <form action="__URL__/up ...
-
mysql开启binlog
mysql开启binlog,至于为什么要开启binlog,可以google下. ## 设置server_id,一般设置为IP server_id= ## 复制过滤:需要备份的数据库名,多个库以逗号分隔 ...
-
Filter的用法之注解
一.filter的概念及功能 Filter就像用滤纸来过滤杂物一样,它也叫过滤器.过滤器是Servlet2.3之后新增加的功能,它可以更变一个request请求也可以修改一个respons ...
-
UIImageVIew的使用
UIImageView是一个用于显示图片的控件 构造方法: UIImage * tempImage = [UIImage imageNamed:IMAGE_NAME]; imageVi ...
-
php的redis函数
phpredis中文手册--<redis中文手册> php版 redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考& ...
-
[AH/HNOI2017]大佬
题目描述 人们总是难免会碰到大佬.他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语. 你作为一个 OIER,面对这样的事情非常不开心,于 ...
-
Sublime Text2支持Vue语法高亮显示
1.下载vue语法高亮插件vue-syntax-highlight 下载地址:https://github.com/vuejs/vue-syntax-highlight 2.将vue-syntax-h ...
-
makefile笔记4 - makefile命令
每条规则中的命令和操作系统 Shell 的命令行是一致的. make 会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的. 在命令行之间中的空 ...
-
No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer
异常信息如下所示: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for cla ...