-1

标题可能不够明确,所以让我试着解释一下。我正在开发一个基于 .NET 的新项目,它由 WPF 客户端组成,这些客户端使用 WCF Web 服务来访问 Oracle 数据库。问题不在于这个基本架构,而在于它应该如何与已经存在的东西一起工作。

目前,应用程序使用 PowerBuilder 编写并直接连接到数据库。此外,他们广泛使用 Oracle 的SELECT .. FOR UPDATE语句通过锁定记录来管理并发性。由于新应用程序必须与旧应用程序并存,因此它们也应该以类似的方式锁定记录,但是依赖于 Web 服务的新架构并不容易做到这一点。

目前,我们正在考虑构建一个“数据服务器”,它将被 Web 服务调用并负责访问数据库。此服务器的目的是维护在多个 Web 服务调用中维护记录锁定所需的打开连接/事务。这是必需的,因为需要操作的“选择”和随后的“更新”部分SELECT .. FOR UPDATE最有可能发生在至少两个单独的 Web 服务调用中(“获取记录”和“更新后”。)

我已经在 Internet 上搜索了有关这种情况的文档,但我似乎找不到关于该主题的太多内容。可以做到这一点——即在多个 Web 服务调用中保持打开记录锁——可以吗?适当地?我的方法合适吗?是否有任何已发布的关于此事的“最佳实践”?

更新:问题的原标题是如何使用面向服务的架构维护记录锁定?我按照约翰的建议更改了它,希望它可以激发一些答案。

4

1 回答 1

0

一般来说,SOA 已经开启了 XA 事务。因此,您可以从中受益并使用 UPDATE / SELECT / UPDATE 策略。也就是说,您将 UPDATE/SELECT 作为单个 INVOKE 示例执行为:

  • UPDATE MY_TABLE SET state='Working' ... ;
  • SELECT * FROM MY_TABLE WHERE state='Working' ...

然后,您可以处理数据而不必担心其他人会声称该数据,因为它已经处于不同的“状态”,前提是您为每个表编写的服务仅存在一个。

最后,您可以使用 UPDATE ... SET ... state='Complete' where state='Working' 来完成它。顺便说一句,这与 DatabaseAdapter 用于轮询的策略相同。

于 2014-02-25T23:45:57.073 回答