【发布时间】:2012-06-06 07:29:13
【问题描述】:
我有一个多线程应用程序,它可能会同时插入一些具有标记为唯一属性的相同类型对象。
public class Foo(){
...
string PropertyThatshouldBeUnique {get;set;}
...
}
每个线程都有自己的会话并且确实:
Foo myFooInstance = new Foo();
myFooInstance.PropertyThatshouldBeUnique = "Bar";
myThreadSession.SaveOrUpadte(myFooInstance);
- 我的数据库表上有一个唯一约束,它阻止了 多次插入,因此第二次出现异常 插入触发整个事务的回滚(不好)
- 并发插入可能非常接近(几毫秒)
- 我没有配置任何具体的Nhibernate Concurrency strategy(不确定这是否能解决我的问题或使用哪一个)
我的问题是:
我应该如何以及在代码中的何处检查以前插入的具有相同属性值的 Foo 对象?
【问题讨论】:
-
"...触发整个事务的回滚(不好)" 为什么你觉得这样不好呢?你预计会发生什么?
-
嗨,迭戈。这不好,因为我不想处理回滚(执行了许多其他操作)。理想情况下,我想要一个检查对象是否已经存在的过程,这样我就不会尝试将它插入两次
-
那么,当要插入重复密钥时,您想要防止做任何事情,对吧?做到这一点的唯一方法是使用排他锁,这对可伸缩性很不利。请问为什么会有并发线程经常尝试使用重复键插入?
-
实际上,如果对象存在,我想要的是执行“更新”而不是“插入”(这意味着我在执行第二次 SaveOrUpdate 调用之前设法得到它)。唯一键可以被视为主键,但我没有这样定义它,因为它是一个长字符串,而且我的全局模式使用整数作为 pkey。
标签: c# multithreading nhibernate concurrency