Mego开发文档 - 处理并发冲突
处理并发冲突
数据库并发是指多个进程或用户同时访问或更改数据库中的相同数据的情况。并发控制是指用于确保存在并发更改时数据一致性的特定机制。
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中时间戳会有如下两个特性组合描述。
- 数据库值生成特性
- 并发令牌特性
例如如下示例,在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可以快速成长,感谢各位的问题及意见反馈。