处理并发冲突

数据库并发是指多个进程或用户同时访问或更改数据库中的相同数据的情况。并发控制是指用于确保存在并发更改时数据一致性的特定机制。

Mego实现了乐观并发控制,这意味着它可以让多个进程或用户独立进行更改,而无需同步或锁定的开销。在理想情况下,这些变化不会互相干扰,因此能够成功。在最糟糕的情况下,两个或更多进程将尝试进行相互冲突的更改,并且只有其中一个应该成功。

并发控制实现

配置为并发令牌的属性用于实现乐观并发控制:无论何时执行更新或删除操作,系统都会自动将数据库中的值与提交值进行比较,由于我们没有像EF中的对象跟踪所以是无法对比对象的原始值。

如果值匹配,操作可以完成。

如果值不匹配,则Mego会假定其他用户执行了冲突操作并中止当前事务。

另一个用户执行与当前操作冲突的操作的情况称为并发冲突。

在关系数据库上,Mego包含WHERE对任何UPDATE或DELETE语句的子句中的并发令牌值的检查。执行完语句后,Mego将读取受影响的行数。

如果受到影响的行数与期望不匹配,则检测到并发冲突,并且Mego将引发DbCommitConcurrencyException。

例如,我们可能需要配置LastName上Person是并发令牌。然后,对Person进行的任何更新操作都将在WHERE条款中包含并发检查:

UPDATE [Person] SET [FirstName] = @p1
WHERE [PersonId] = @p0 AND [LastName] = @p2;

时间戳说明

由于不同数据库的时间戳是不想同的,因此Mego中时间戳会有如下两个特性组合描述。

  1. 数据库值生成特性
  2. 并发令牌特性

    例如如下示例,在MySQL中时间戳即为日期时间,通过Mego是无法修改UpdateDate这个属性的,但是这个属性会参与提交并发检查,当数据发生更改时都会从数据库返回新的值。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
[ConcurrencyCheck]
[GeneratedValue(EGeneratedPurpose.InsertUpdate)]
public DateTime UpdateDate { get; set; }
}

[文档目录]

Mego开发文档 - 处理并发冲突的更多相关文章

  1. Mego开发文档 - 索引

    Mego 开发文档 Mego 快速概述 主要特性 获取Mego 使用流程 模型 查询 保存数据 入门 Mego 快速开始 创建项目 安装Nuget包 创建连接字符串 创建模型及数据上下文(添加引用) ...

  2. Mego开发文档 - 数据注释建模

    数据注释建模 Mego框架使用一组约定来基于CLR类来构建模型.您可以指定其他配置来补充或覆盖通过约定发现的内容. 在 Mego 中所有的数据对象必须要有主键.这里需要声明与EF不同的是框架只支持数据 ...

  3. Mego开发文档 - 快速概述

    Mego 快速概述 Mego 是一款轻量级,可扩展和跨平台的数据访问技术. Mego 是一个对象关系映射器(O / RM),它使.NET开发人员能够使用.NET对象处理数据库.它消除了开发人员通常需要 ...

  4. Mego开发文档 - 快速开始

    Mego 快速开始 我们将创建一个简单的数据新增及查询来演示 Mego 的使用过程.演示中都是使用 Visual Studio 2017 作为开发工具,SQL Server 2012 作为数据库. 创 ...

  5. Mego开发文档 - 建模高级主题

    建模高级主题 在建模过程中我们还有许多其他情况,这里列出本框架中的有用特性来用于解决此类问题. 函数映射 我们可以将指定的CLR函数映射到数据库中的系统函数或自定义函数,该特性用于补充框架中未提供的数 ...

  6. Mego开发文档 - 基础查询

    基础查询 Mego 使用语言集成查询(LINQ)从数据库查询数据.LINQ允许您使用C#(或其他.NET语言)根据派生的上下文和实体类编写强类型查询.将LINQ查询的表示传递给数据库提供者,翻译为数据 ...

  7. Mego开发文档 - 复杂查询

    复杂查询 Mego 还支持一些更高级的LLINQ查询写法,本文只列出一部分. 分组汇总查询 using (var db = new OrderManageEntities()) { var query ...

  8. Mego开发文档 - 加载关系数据

    加载关系数据 Mego允许您使用模型中的导航属性来加载相关数据对象.目前只支持强制加载数据对象.只有正确配置了关系才能加载关系数据,相关内容可参考关系配置文档. 加载对象属性 您可以使用该Includ ...

  9. Mego开发文档 - 基本保存操作

    基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...

随机推荐

  1. MySQL服务读取参数文件my.cnf的规律研究探索

    在MySQL中,它是按什么顺序或规律去读取my.cnf配置文件的呢?其实只要你花一点功夫,实验测试一下就能弄清楚,下面的实验环境为5.7.21 MySQL Community Server.其它版本如 ...

  2. c# redis 操作类库推荐:StackExchange.Redis.Extensions

    StackExchange是一个优秀的c# redis客户端,但是存在操作略为繁琐的弊端,为了简化操作,使用 StackExchange.Redis.Extensions成为了一个非常值得推荐的选择. ...

  3. c++运行时函数

    函数 包含 类别 功能 _atold math.h 数学子程序 把字符串转换成浮点数 _beginthread process.h 进程控制子程序 启动执行一个新线程 _bios_disk bios. ...

  4. 机器学习实战笔记(Python实现)-09-树回归

    ---------------------------------------------------------------------------------------- 本系列文章为<机 ...

  5. 用MATLAB结合四种方法搜寻罗马尼亚度假问题

    选修了cs的AI课,开始有点不适应,只能用matlab硬着头皮上了,不过matlab代码全网仅此一份,倒有点小自豪. 一.练习题目 分别用宽度优先.深度优先.贪婪算法和 A*算法求解"罗马利 ...

  6. KeePass使用心得

    这几天发现有人说lastpass并不安全,于是发现了KeePass这个软件,其实这个软件很早之前就知道,不过没有使用,下面就说说我找到的关于这个工具的所有总结. KeePass 配合 Firefox ...

  7. jmeter--简单的接口测试(GET/POST)

    最近在学习接口测试,本文就简单的谈一谈对接口相关知识的理解. 一.什么是接口? 程序接口:由一套陈述.功能.选项.其它表达程序结构的形式.以及程序师使用的程序或者程序语言提供的数据组成(百度百科定义) ...

  8. GO语言初探

    1.GO使用UTF-8编码,纯Unicode文本编写. 2.$ go verson (windows) 3.windows下,需要设置go语言的环境变量,新建一个名为 GOROOT的变量,指向go的具 ...

  9. 【itchat】用Python玩耍微信

    [itchat] itchat是个基于网页版微信的python微信API.功能目前做到基本可以满足正常的消息收发,信息的获取等等.不过对于红包之类网页版微信不支持的功能,这个模块自然也就无法支持了. ...

  10. oracle 11g数据库 DMP还原数据库

    -------------------------- jd :表空间 -------------------------- --本地登陆 cmd下直接执行 sqlplus/as sysdba; --修 ...