Dapper怎么处理数据库的rowversion/timestamp Dapper并发标记列

admin 百科 12
Dapper 不自动处理 rowversion 并发标记,需手动在查询中包含 RowVersion 字段并映射为 byte[],更新时在 WHERE 中显式比对原值,冲突时 rows=0 或 OUTPUT 返回 null,推荐用 OUTPUT 获取新 RowVersion。

Dapper怎么处理数据库的rowversion/timestamp Dapper并发标记列-第1张图片-佛山资讯网

Dapper 本身不自动处理 rowversion(SQL Server)或 timestamp(旧称,现为 rowversion)这类并发标记列,但可以很方便地配合它实现乐观并发控制。关键在于:Dapper 不拦截或修改 SQL,你需要自己把 rowversion 字段读出来、传进去、并在 WHERE 条件中显式比对。

读取时带上 rowversion

查询实体时,必须把 rowversion 列包含在 SELECT 中,并映射到实体的 byte[] 或 byte[8] 属性上(SQL Server 的 rowversion 固定 8 字节):

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public byte[] RowVersion { get; set; } // 必须是 byte[],不能是 string 或 long
}

登录后复制

查询示例:

var product = connection.QueryFirstOrDefault<Product>(
    "SELECT Id, Name, RowVersion FROM Products WHERE Id = @id", 
    new { id = 123 });

登录后复制

更新时用 WHERE 比对 RowVersion

执行 UPDATE 时,在 WHERE 子句中加入 RowVersion = @originalRowVersion,确保只更新未被他人修改过的行:

var rows = connection.Execute(
    @"UPDATE Products 
      SET Name = @name 
      WHERE Id = @id AND RowVersion = @originalRowVersion",
    new { 
        name = "New Name", 
        id = product.Id, 
        originalRowVersion = product.RowVersion 
    });

登录后复制

如果 rows == 0,说明并发冲突发生(别人已更新,当前 RowVersion 已变),应抛异常或提示重试。

标签: app 字节

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~