对于NHibernate或任何其他ORM,是否存在类似“长时间运行的脱机事务”的行为?

时间:2010-03-16 21:49:51

标签: nhibernate orm transactions offline

实质上,这是this question的后续行动。我开始觉得我应该放弃整个想法,但我会再给它一次。

我想要的就像数据库交易一样。它应该跟踪我对数据库的更改,然后最终允许我提交或回滚它们。如果我插入一个对象,我应该在我的下一个(适当的)SELECT查询中找回它。如果我删除它,将来的SELECT查询不应该返回它。等

但是有一个问题 - 这个交易将会持续很长时间。它将在用户打开表单时启动(我在这里谈论Windows窗体),并且提交/回滚将在用户关闭它时(使用“确定/取消”)。所以它可能需要几秒到几天。此要求排除了标准数据库事务,因为这会锁定它触及的表/行,而其他用户将无法使用该系统。此事务在实际提交之前不应对数据库进行任何更改。因此,如果一个用户进行了一些更改,其他用户只有在按下OK按钮后才会看到它们。这可以防止计算机崩溃或断开网络连接时出现错误。

如果解决方案对我的模型施加约束(我正在使用MSSQL 2008,顺便说一句),我很好。我可以按照自己喜欢的方式设计DB /代码。我也认为提交可能会失败,因为有人已经修改了我的交易触及的其中一个对象。

有这样的事吗?我看了NHibernate.Burrow,但我不确定那是我想要的。

已添加:这是项目的开始,所以我不依赖于NHibernate。我开始使用它,但我仍然可以轻松改变。

5 个答案:

答案 0 :(得分:3)

据我所知,DataObjects.Net通过DisconnectedState支持这个概念。该功能非常新(仅在几周前发布),其初步文档为hereWPF sample for DataObjects.Net将其用于UI事务。

我不确定是否在那里提到它,但是DisconnectedState以及它的OperationLog可以被序列化。因此,即使应用程序重新启动,其缓存状态也可以存活。

答案 1 :(得分:1)

我认为没有人会在NHibernate核心中实现这一点,因为没有人会使用它。 Viewmodel与域模型的模型不同。

答案 2 :(得分:0)

这不是你问题的直接答案,但这就是WWF(必须爱这个名字)的目的是解决这个问题(而不是至少在第3.5节这样做)。

答案 3 :(得分:0)

如果您仍在关注此事,Ayende Rahien在MSDN杂志http://msdn.microsoft.com/en-us/magazine/ee819139.aspx中有一篇关于每个表单/演示者方法的会话的文章。另请参阅NHibernate书籍http://manning.com/kuate/的第5章(可用的样本章节),关于交易和对话的书。

只要你按下刷新/交易,直到按下确定按钮,它就应该工作(取决于冲洗模式)。但完全隔离是一个困难的问题,因为您的会话将能够访问其他会话在处理多个实体时提交的数据。你将不得不考虑处理这些问题。

顺便说一句,如果你不使用NHibernate,你将如何处理这种情况?

答案 4 :(得分:0)

EclipseLink对这种野兽的支持有限。他们称之为“符合”,并且他们在“工作单元”背景下实施了它。