我想根据您对基于SOA的体系结构的经验以及如何使用WCF和nHibernate实现并发控制,向大家提供建议。
一个。 User1现在已经打开订单并对其进行编辑。 湾User2同时打开相同的订单并编辑它。
我们如何阻止User2执行此操作。两个WCF调用“编辑顺序”都使用不同的nHibernate会话来获取记录,因为应用程序服务器被设计为无状态。
如何配置nHibernate / WCF来处理这种情况?
如果输入订单涉及多个页面;如果订单数据在Web服务器(ASP .NET)上跨这些页面维护并在每个WCF调用上发布,并且处理订单业务逻辑,那么基于业务逻辑(WCF调用以确定下一页)显示页面?我的想法是对的吗?
我知道另一种方法,即创建一个临时订单记录来维护跨页/ WCF调用的中间数据。
答案 0 :(得分:3)
关于第一个场景,您不希望阻止用户尝试进行编辑;如果你试图强制执行悲观并发,你的系统永远不会扩展。
相反,您希望使用乐观并发;你的模型会有一个时间戳(通常是一个实际的日期时间值,或者更好的是,某种二进制值保证对于特定的上下文/表是唯一的)。大多数ORM(包括nHibernate,我相信)都支持乐观并发;在生成更新时,它只会更新记录,如果主键是相同的和时间戳是相同的,如果不是,那么你知道其他人编辑了自上次以来的记录你获取数据的时间。
对于第二种情况,您可能需要考虑与WCF紧密集成的Windows Workflow。一般来说,我有一个单独的表,其中包含不完整的订单信息以及用户可以使用的密钥(可能是会话ID)来查找数据。
只有当您知道订单已完成时,才会将数据从“临时”表格移动到您的真实订单表。