新闻中心

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

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

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

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 已变),应抛异常或提示重试。

DeepBrain DeepBrain

AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!

DeepBrain 146 查看详情 DeepBrain

更新后重新获取新 RowVersion(可选但推荐)

SQL Server 支持 OUTPUT 子句,可在 UPDATE 后立即返回新生成的 rowversion,避免额外查询:

var updated = connection.QueryFirstOrDefault<Product>(
    @"UPDATE Products 
      SET Name = @name 
      OUTPUT INSERTED.Id, INSERTED.Name, INSERTED.RowVersion
      WHERE Id = @id AND RowVersion = @originalRowVersion",
    new { 
        name = "New Name", 
        id = product.Id, 
        originalRowVersion = product.RowVersion 
    });

如果 updated == null,即更新失败(并发冲突);否则 updated.RowVersion 就是最新值,可用于后续操作。

注意点和常见坑

  • 类型必须是 byte[]:用 longstringGuid 映射会出错或值错误
  • 参数名要区分新旧:如 @originalRowVersion@newRowVersion(后者一般不用传,DB 自动生成)
  • 不支持 Dapper 的自动乐观并发(像 EF 的 [ConcurrencyCheck]:一切靠手写 SQL 控制
  • INSERT 无需处理rowversion 是数据库自动生成的,INSERT 语句里不要指定该列

基本上就这些。Dapper 的轻量哲学决定了它不封装并发逻辑,但正因如此,你完全掌控 SQL,能写出高效、明确的乐观并发方案。

以上就是Dapper怎么处理数据库的rowversion/timestamp Dapper并发标记列的详细内容,更多请关注其它相关文章!


# 这类  # 简述网站推广的内容  # 小红书店铺营销推广方案  # 本地seo排名怎么做  # seo排名工具选择16火星  # 通州区推广网站搭建中心  # p2p营销推广案例研究  # 淮南seo站内优化公司  # 泰山网站建设内容  # 河南网站seo  # 网站怎么样优化  # app  # 相关文章  # 并在  # 你可以  # 如何实现  # 自动生成  # 如何使用  # 比对  # 子句  # 怎么处理  # 字节 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: AO3访问入口汇总 AO3网页版同人作品一键直达  处理动态列数据:J*a ArrayList的正确初始化与字符累加教程  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  Linux如何构建多环境配置管理_Linux多环境配置方案  《刺客信条:影》PS5 Pro和Switch 2画面对比  Android Studio计算器C键逻辑错误排查与修复:条件判断优化指南  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  J*aScript中针对特定容器内图片动画的实现教程  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  J*aScript中如何高效提取对象指定属性  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  J*aScript中在Map循环中检测并处理空数组元素  痛风发作了怎么办? 快速止痛和后期饮食调理  电脑IP地址怎么查 查看本机IP地址的几种方法  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  Sublime Text怎么显示空格和制表符_Sublime显示不可见字符设置  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  大象笔记网页版入口 印象笔记网页版登录入口  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  Go语言中的*string:深入理解字符串指针  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南  c++ dfs和bfs代码 c++深度广度优先搜索算法  BetterDiscord插件中安全更新用户简介的实践指南  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问  Angular Material 垂直步进器:实现底部到顶部排序的教程  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  如何创建独立于主系统的J*a运行环境_隔离式环境搭建策略  Win11怎么开启省电模式_Win11电池节电模式自动开启  Tabulator表格日期时间排序问题及自定义解决方案  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  fishbowl官网免费版 fishbowl养鱼网站入口  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  包子漫画官方网站在线链接-包子漫画在线阅读平台主页地址  J*aScriptWebpack优化_J*aScript构建工具实战  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  响应式容器内容自动缩放与宽高比维持教程  J*aScript类型检查_j*ascript代码规范 

搜索