新闻中心
Dapper怎么处理数据库的rowversion/timestamp Dapper并发标记列
Dapper 不自动处理 rowversion 并发标记,需手动在查询中包含 RowVersion 字段并映射为 byte[],更新时在 WHERE 中显式比对原值,冲突时 rows=0 或 OUTPUT 返回 null,推荐用 OUTPUT 获取新 RowVersion。

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
AI视频生成工具,ChatGPT +生成式视频AI =你可以制作伟大的视频!
146
查看详情
更新后重新获取新 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[]:用long、string或Guid映射会出错或值错误 -
参数名要区分新旧:如
@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代码规范


2025-12-13
浏览次数:次
返回列表