C# &引用;悲观离线锁“;与第三方并发作者

C# &引用;悲观离线锁“;与第三方并发作者,c#,database,design-patterns,concurrency,C#,Database,Design Patterns,Concurrency,我们有一个应用程序,可以读取和写入第三方数据存储。 该数据存储的代码是封闭源代码,我们不知道也不能更改它。 只有一个纤薄的API允许对其进行读写 有助于跨越事务并让并发应用程序使用它。我相信那会很好的 但现在我们有一个问题,其他软件也会对该存储进行写入和读取 当数据存储发生变化时,我们的应用程序将进行更新。数据存储本身不提供任何通知。第三方软件不会更改某些全局状态,表明某些内容已更改 是否有任何类型的模式或最佳实践来“观察”数据存储和 发布事件以更新(我们软件的)所有客户端 如果不是,我真的不想

我们有一个应用程序,可以读取和写入第三方数据存储。 该数据存储的代码是封闭源代码,我们不知道也不能更改它。 只有一个纤薄的API允许对其进行读写

有助于跨越事务并让并发应用程序使用它。我相信那会很好的

但现在我们有一个问题,其他软件也会对该存储进行写入和读取 当数据存储发生变化时,我们的应用程序将进行更新。数据存储本身不提供任何通知。第三方软件不会更改某些全局状态,表明某些内容已更改

是否有任何类型的模式或最佳实践来“观察”数据存储和 发布事件以更新(我们软件的)所有客户端

如果不是,我真的不想定期阅读、比较和发布事件
绝对是最后的手段。也许有人有更好的想法?

非系统实现的悲观离线锁需要所有可能的数据修改者之间的合作/参与/实施。这通常是不可能的,也是现代软件很少采用这种方法的两个原因之一。要以一种有用的方式远程执行类似的操作(即,使用多个异种编写器),需要系统设施本身的某种帮助/协助。(第二个原因是确定和解决废弃锁的问题,问题非常严重)

至于可能的解决方案,那么从纯设计的角度来看,要么是乐观的脱机锁(仍然需要一些系统帮助,但需要的帮助要少得多),要么是通过数据模型中更详细的状态进程/控制来完全避免问题

然而,我的方法是(最初)将设计问题放在一边,认识到这主要是数据存储的功能问题,并从那里开始,寻求使用系统提供的锁/事务控制(1:通常有效,2:通常有效)

顺便说一句,同步多编写器访问的问题始终必须从“有哪些工具/控件/设施可用于约束、转移和/或跟踪应用程序外的编写器”开始。实际上,这些设施限制了您所能完成的任务

例如,如果您可以通过自己的服务强制所有访问,那么您几乎可以做任何事情。但是,如果你所拥有的只是操作系统的文件锁定和文件修改日期,那么你就会受到更多的约束。如果你连这个都没有,那你就无能为力了

事实上,我没有直接访问数据存储的权限,它位于 有些服务器和我无法控制其他应用程序 读和写。现在,我能想到的最好的办法就是 服务作为代理,定期查询存储,比较存储 如果出现其他情况,则会将更新事件发送到旧状态,并将更新事件发送到我的客户端 应用程序已更改它(如果我的 应用程序将其更改为通知我自己的客户,而不通知其他客户 应用程序本身有问题)。这对我来说不是很好, 但它可能起到了作用


是的,这就是您所能做的,它只支持乐观并发(部分),而不支持悲观并发。通过向存储的数据添加某种校验和/哈希,您可能会得到改进,但这只是一种优化。

非系统实现的悲观离线锁需要所有可能的数据修改者之间的合作/参与/强制执行。这通常是不可能的,也是现代软件很少采用这种方法的两个原因之一。要以一种有用的方式远程执行类似的操作(即,使用多个异种编写器),需要系统设施本身的某种帮助/协助。(第二个原因是确定和解决废弃锁的问题,问题非常严重)

至于可能的解决方案,那么从纯设计的角度来看,要么是乐观的脱机锁(仍然需要一些系统帮助,但需要的帮助要少得多),要么是通过数据模型中更详细的状态进程/控制来完全避免问题

然而,我的方法是(最初)将设计问题放在一边,认识到这主要是数据存储的功能问题,并从那里开始,寻求使用系统提供的锁/事务控制(1:通常有效,2:通常有效)

顺便说一句,同步多编写器访问的问题始终必须从“有哪些工具/控件/设施可用于约束、转移和/或跟踪应用程序外的编写器”开始。实际上,这些设施限制了您所能完成的任务

例如,如果您可以通过自己的服务强制所有访问,那么您几乎可以做任何事情。但是,如果你所拥有的只是操作系统的文件锁定和文件修改日期,那么你就会受到更多的约束。如果你连这个都没有,那你就无能为力了

事实上,我没有直接访问数据存储的权限,它位于 有些服务器和我无法控制其他应用程序 读和写。现在,我能想到的最好的办法就是 服务作为代理,定期查询存储,比较存储 如果出现其他情况,则会将更新事件发送到旧状态,并将更新事件发送到我的客户端 应用程序已更改它(如果我的 应用程序将其更改为通知我自己的客户,而不通知其他客户 应用程序本身有问题)。这对我来说不是很好, 但它可能起到了作用

是的,这就是您所能做的,它只支持乐观并发(部分),而不支持悲观并发。通过向存储的数据添加某种校验和/哈希,您可能会得到改进,但这只是一种优化。

Wha