使用 NHibernate 更新时整数列的并发增量

Posted

技术标签:

【中文标题】使用 NHibernate 更新时整数列的并发增量【英文标题】:Concurrent incrementation of integer column on update with NHibernate 【发布时间】:2011-08-11 23:32:15 【问题描述】:

我有一个带有 Version 数字列的 Posts 表,用于跟踪每条记录的第 n 次修订。每次更新一行时,我希望其 Version 编号增加。

目前,我正在增加应用程序逻辑中的列,但因为post.Version += 1; 不等于UPDATE Posts SET Version = Version + 1...,我担心两个并发更新只会导致一个版本增加。

使用手动 SQL 表达式(如上)或更新触发器很容易解决这个问题,但如果可能的话,我宁愿让 Fluent NHibernate 为我处理这个问题。

使用事务进行更新不会阻止两个同时读取都看到版本“7”,并且都决定下一个值应该是 8。因此,对版本 7 的两次更新可能会导致值 8,而不是9 个。

如何设计或映射并发安全的自动递增整数列?

【问题讨论】:

或许这个话题也值得一查,相关:***.com/questions/18362228/… 【参考方案1】:

它已经融入 NHibernate。查看<version> 标签和乐观并发控制上的 NH 文档。

【讨论】:

+1 谢谢!我在 Fluent NHibernate 中找到了 Version(x => x.Version); 映射 :) 领先我几秒钟 :-)【参考方案2】:

为什么要手动管理版本列?

使用 NHibernate 对乐观并发的支持(请参阅 http://www.nhforge.org/doc/nh/en/index.html#mapping-declaration-version),您将免费获得它(以及更正确的行为 IMO)

【讨论】:

谢谢(我是 NHibernate 的新手)。我不知道我是如何使用 LINQ-to-SQL 的?!

以上是关于使用 NHibernate 更新时整数列的并发增量的主要内容,如果未能解决你的问题,请参考以下文章

使用Redis SortedSet实现增量更新

自动增量(身份)在 Fluent NHibernate 中不起作用

如何绕过 NHibernate 版本控制更新 SQL 中的记录

NHibernate教程--并发控制

具有增量整数列的 MSSQL Select 语句...不是来自表

NHibernate 中的自动更新包