Skip to content

RowVersion

什么是RowVersion?

RowVersion是一种用于解决并发问题的机制,基于关系数据库特性的乐观锁的一种实现,在并发环境中,多个用户可能同时变更同一行数据,如果不加以限制,不同用户之间的操作可能相互覆盖,导致数据不一致的问题。RowVersion就是为了解决这个问题而设计的。

RowVersion的实现原理

RowVersion的实现原理是在每一行数据中增加一个版本号字段,每次对这一行数据进行更新操作时,版本号加1。在事务开始时,事务会读取当前行的版本号,执行update时,会更新RowVersion,并在where条件中增加类似row_version=@oldversion这样的条件,事物提交前,会检查影响行数是否与预期一致,如果一致,则提交事务,否则回滚事务。

RowVersion的使用场景

RowVersion主要用于解决并发问题,例如在订单系统中,当多个用户同时对同一订单进行操作时,可能会导致订单状态不一致的问题。通过使用行版本号,可以避免这种问题的发生。

定义行版本号

在领域模型中,定义一个NetCorePal.Extensions.Domain.RowVersion类型的public可读的属性,即可实现行版本号的功能,框架会自动处理行版本号的更新和并发检查逻辑。

下面是一个示例:

// 定义行版本号
using NetCorePal.Extensions.Domain;
namespace YourNamespace;

//为模型定义强类型ID
public partial record OrderId : IInt64StronglyTypedId;

//领域模型
public class Order : Entity<OrderId>, IAggregateRoot
{
    protected Order() { }
    public string OrderNo { get; private set; } = string.Empty;
    public bool Paid { get; private set; }
    //定义行版本号
    public RowVersion Version { get; private set; } = new RowVersion();

    public void SetPaid()
    {
        Paid = true;
    }
}

RowVersion不适合的场景

RowVersion适用于并发量较小的场景,如果并发量较大,可能会导致大量的行版本号冲突,从而影响用户体验。在这种情况下,可以考虑使用悲观锁来解决并发问题。