2011-04-11 42 views
3

我有一个实体有多个字段。可以对其执行两种类型的操作:通常由用户启动的较长操作,以及由系统定期运行的较短操作。这两个都更新了实体,但它们涉及不同的领域。NHibernate:修改两个会话中的实体的不同字段

不能有两个并发的长操作或两个并发的短操作。但系统可能会在长时间的操作正在进行时安排短暂的操作,并且这两者应该同时执行。由于它们涉及不同的领域,我相信这应该是可能的。我认为NHibernate的变更跟踪应该在这里做 - 即,如果一个会话加载一个实体并更新一些字段,而另一个会话加载相同的实体并更新不同的字段,则两者不会相互冲突。不过,我觉得我不应该依赖这个,因为它听起来像是一个“优化”或“实现细节”。我倾向于将更改跟踪视为优化来减少数据库流量,我不希望系统的功能依赖于它。另外,如果我决定实现这个实体的乐观并发性,那么我冒险得到一个StaleObjectException,尽管我可以保证没有实际的碰撞。

什么是最好的方法来实现这一目标?我应该将实体分成两个吗?这不会影响数据库的一致性(例如,如果实体中只有一个“一半”在DB中)?我可以使用NHibernate显式设置一个实体的单个字段吗?我不想依赖变更追踪来实现功能吗?

如果它很重要,我使用流利的NHibernate。

回答

2

您可以使用dynamic update来映射实体。

  • dynamic-update(可选,默认为false):指定UPDATE SQL应该在运行时生成并且只包含那些值已更改的列。

如果启用了动态更新,您将有乐观锁定的策略选择:

  • version检查version/timestamp字段
  • all检查所有列
  • dirty检查的改变列
  • none不使用乐观锁定

更多信息here

+0

感谢您的建议。但是,这仍然不依赖于追踪“优化”的变化吗?我担心的是,我始终认为变更跟踪是为了优化目的而减少数据库查询的一种方式。我得到这种依赖于功能要求的不舒服感(即允许两个操作同时运行)。难道它是更明确的(因此不太可能因意外更改而中断)来分离这两个操作的数据? – telewin 2011-04-13 06:31:00

+0

@telewin我仍然看不到分离实体的好处。动态更新只会更新已更改的属性,而不管其中的更改是什么,并且根据您的模型,两种操作都不会与其他工作重叠,但我仍然没有看到问题。 :) – rebelliard 2011-04-13 12:07:05

+0

我担心的是人(即,其他开发人员)可能会将更改跟踪视为优化,这意味着它可以在不影响功能的情况下关闭。如果您将锁定策略从“脏”更改为“版本”,并且事情停止工作,它会不会让您感到惊讶?分离实体将防止发生。或者你是否认为锁定策略应该被视为功能的一部分,所以这是可以接受的?当然,乐观和悲观锁定之间的选择是功能的一部分(影响例外等)。 – telewin 2011-04-13 12:29:41

相关问题