我正在调查NHibernate中的乐观并发性。我的场景与此处描述的场景非常相似:
您是否建议在此博客文章中使用建议的解决方案?
由于
答案 0 :(得分:3)
博客建议使用拦截器从数据库重新加载当前版本号,以便使用从DTO对象通过实体传入的版本执行手动版本检查。这肯定会有效,但正如本文所述,它会增加额外的数据库命中来加载当前的版本号。
更好的解决方案,这似乎非常明显,因为它实际上是在该博客条目中描述和引用的“应用程序版本检查”文档中描述的内容。也就是说,使用DTO的版本对最初加载的实体执行版本检查。更具体地说,使用文章中的代码(对文章代码的更改是粗体):
public void Update(MyDTO dto) { // Select the item. var item = this.repository.SelectById(dto.Id); // Verify there hasn't been a concurrent change if(item.Version != dto.Version) { throw new StaleObjectStateException(); } // Map values from DTO to model. item.Name = dto.Name;item.Version = dto.Version;// Call update this.repository.Update(item); }