我已经阅读了Jonathan Oliver关于处理无序事件的好帖子.
http://blog.jonathanoliver.com/cqrs-out-of-sequence-messages-and-read-models/
我们使用的解决方案是将消息出列并将其置于"保持表"中,直到收到具有先前序列的所有消息.当收到所有先前的消息后,我们将所有消息从保留表中取出,并通过适当的处理程序依次运行它们.一旦所有处理程序都成功执行,我们将从保留表中删除消息并将更新提交给读取的模型.
这适用于我们,因为域发布事件并使用适当的序列号标记它们.如果没有这个,下面的解决方案将变得更加困难 - 如果不是不可能的话.
此解决方案使用关系数据库作为持久性存储机制,但我们没有使用存储引擎的任何关系方面.与此同时,所有这一切都有一个警告.如果消息2,3和4到达但消息1从未到达,则我们不会应用其中任何消息.只有在出现错误处理消息1或消息1以某种方式丢失时,才会出现这种情况.幸运的是,很容易纠正我们的消息处理程序中的任何错误并重新运行消息.或者,在丢失消息的情况下,直接从事件存储重建构建读取模型.
得到了一些问题,尤其是关于他如何说我们总能向活动商店询问缺失的事件.
我正在使用以下格式使用linq将更改提交到我的数据库.
Begin Transaction (Scope Serialized, Required)
Check Business Rule 1...N
MyDataContext.SubmitChanges()
Save Changes Done In Previous Query To Log File
End Transaction Scope
Run Code Online (Sandbox Code Playgroud)
但是在SQL Server探查器中,我在Connection:Start中看到以下行.
set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)
我经历了这个(http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/93a45026-0425-4d49-a4ac-1b882e90e6d5)并认为我得到了答案;
直到我在Microsoft Connect上看到这个(https://connect.microsoft.com/VisualStudio/feedback/details/565441/transactionscope-linq-to-sql?wa=wsignin1.0).
有人可以告诉我,我的代码是否实际在序列化隔离级别下执行,或者它是否只是在read committed下运行?
transactions sql-server-profiler isolation-level sql-server-2008 linq-to-sql