使用 NHibernate 异步保存到数据库时,我遇到了竞争条件问题。首先,对数据库的插入是异步完成的,其中唯一的 id 是自动生成的。在此插入返回主线程之前,现在持久对象具有唯一的数据库生成的 id,该对象以某种方式更新。如果我调用 session.Update 更新将失败,因为要更新的对象还没有 id 值。如果我调用 SaveOrUpdate 它显然会导致插入而不是更新,因为我的实体的 id 字段等于未保存的值属性。希望这段代码能让情况更清楚:
Entity entity = new Entity()
//update some fields
entity.PropertyTwo = "new value";
//dataObject as the database auto-generated Id
//insert new row asynchronously in different thread
Entity entity.Id = dao.save(entity.Clone()).Id
//before the the entity is returned from the database, the entity might be updated
entity.Property = 'new value';
//entity might be sent without an Id since the first asynch call has not returned yet.
//update asynchronously in another thread
Object dataObject = dao.Update(entity); //fails because Id is not set yet
一种解决方案是在保存之前在代码中生成唯一 ID。在这种情况下,应用程序管理唯一 id 的递增,而不是数据库。还有其他处理方法吗?