如何为NServicebus的NHibernate Saga Persister使用Version属性?

时间:2013-12-24 18:41:31

标签: c# concurrency nservicebus saga

原谅我提出的问题可能有一个非常明显的答案(RTFM),但是如何让提到here的“版本属性”真正起作用呢?提供的链接到Ayende的网站here和github repo here暗示这是可能的。还有另一个SO链接here描述了同样的问题,但没有真正公布明确的解决方案。我也无法在与此功能相关的发行说明或文档中找到NSB示例代码或任何内容。但是,对于运行带有多个工作线程和ReadCommited的传奇的人来说,这是至关重要的知识。

是否真的像为saga数据类添加一个名为Version的整数属性以及为saga数据表添加时间戳/ rowversion一样简单?这是真的在某个地方的样本中,我只是不是在正确的地方寻找?

另外,根据我发布的评论,看起来NSB 3.x中存在涉及此功能的错误。我是否需要升级到4.x才能获得此功能,还是有一种简单的方法可以让它在3.x中运行?

谢谢!

修改

使用John Simon的答案,我最初使用以下NSB版本遇到了一个错误:

NHibernate: 3.3.3.4001
NServiceBus: 4.3.1
NServiceBus.Host: 4.3.1
NServiceBus.Interfaces: 4.3.3
NServiceBus.NHibernate: 4.3.0
NServiceBus.StructureMap: 4.3.1

我打开了this issue on github,经过一些回复&第四,尝试了一个包含修复的开发构建,并使其工作。官方修复程序在NServiceBus.NHibernate v4.4.0中发布。

我对答案的看法是将其与时间戳SQL列一起使用:

[RowVersion]
public virtual byte[] Version { get; set; }

经过几天的锤击,看起来不错。

1 个答案:

答案 0 :(得分:3)

在v3中,您需要做的就是在saga上定义一个版本属性:

public virtual int Version {get;set;}

在第4版中,我们默认为"乐观 - 全部"并发模型,如果需要自定义行级并发,则执行与v3 +属性相同的操作:

[RowVersion]
public virtual int Version { get; set; }