Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从多个进程访问数据库的模式_C#_Design Patterns_Deployment_Windows Services - Fatal编程技术网

C# 从多个进程访问数据库的模式

C# 从多个进程访问数据库的模式,c#,design-patterns,deployment,windows-services,C#,Design Patterns,Deployment,Windows Services,我有一个用C#编写的windows调度程序服务,它从数据库中查询一组记录,对数据执行一组操作,并将这些记录更新回数据库。我现在需要在多台机器上部署此服务。然而,我最终要解决的明显问题是并发性。在多台计算机上运行的服务不应拾取相同的记录。是否有适合这种情况的模式/最佳实践? 我正在使用Oracle11g数据库 在使用多线程方法处理记录之后,我们的性能已经达到了最大限度。为了获得更高的性能,我们正在考虑在多台机器上运行该服务。您需要以编程方式维护并发性 您可以在表(记录)中设置状态列,说明记录是否已

我有一个用C#编写的windows调度程序服务,它从数据库中查询一组记录,对数据执行一组操作,并将这些记录更新回数据库。我现在需要在多台机器上部署此服务。然而,我最终要解决的明显问题是并发性。在多台计算机上运行的服务不应拾取相同的记录。是否有适合这种情况的模式/最佳实践? 我正在使用Oracle11g数据库


在使用多线程方法处理记录之后,我们的性能已经达到了最大限度。为了获得更高的性能,我们正在考虑在多台机器上运行该服务。

您需要以编程方式维护并发性

  • 您可以在表(记录)中设置状态列,说明记录是否已处理或正在处理或未处理
  • 如果希望避免其他事务更新相同的值,可以在表(记录)中使用行版本/时间戳。(考虑MS-SQL Server系列)

  • 我们能知道在多台机器上提供服务的原因吗?如果您的答案取决于性能,那么您可以使用任务/多线程等来实现同样的效果。

    在我看来,您可以使用存储过程,该存储过程在执行后立即将相应的实体标记为“正在进行”或其他内容(必须锁定该存储过程,以便另一个存储过程调用不能中断)或者通过编写一个代理来访问处理多重访问的数据库。如果它做同样的事情,为什么要将它部署到多台机器上?这有什么真正的好处吗?根据您的描述,您已经在制造麻烦:)@Markus Safar,我正按照您提到的类似思路思考,但无法找到锁定状态更新的最佳方法。您可以使用和,或者感谢您的回复。在使用多线程方法处理记录之后,我们已经达到了最大限制。为了获得更高的性能,我们正在考虑在多台机器上运行该服务。即使我们使用状态列,当多个进程尝试更新状态列时,我们是否也会遇到并发问题。对于并发问题,答案是“是”和“否”。请参阅使用时间戳进行并发检查和锁定,您可以使用具有适当隔离级别的事务。如果表查询比率太频繁,那么请注意使用高(可序列化)隔离级别