【问题标题】:WCF Service Throttling settings for concurrency with SQL Transaction用于 SQL 事务并发的 WCF 服务限制设置
【发布时间】:2011-05-18 13:53:43
【问题描述】:

我有一个 WCF 服务,它有一个复杂的 operationcontract 必须以原子方式执行,即整个操作成功或失败。 WCF 服务托管在 ASP .NET 应用程序中的 IIS 服务器上。此操作具有在事务中执行的一系列 SQL 命令。在测试期间,我发现在 4 - 5 个用户同时访问的情况下,至少有一个用户出现“事务死锁”错误。

然后我查看了我设置的 serviceThrottling 设置

<serviceThrottling  maxConcurrentCalls ="5" maxConcurrentInstances ="50" maxConcurrentSessions ="5" />

改成

<serviceThrottling  maxConcurrentCalls ="1" maxConcurrentInstances ="1" maxConcurrentSessions ="1" />

我已关闭会话,因为我不需要服务合同。所以我不知道 maxConcurrentSessions 是否会产生任何影响

<ServiceContract([Namespace]:="http://www.8343kf393.com", SessionMode:=SessionMode.NotAllowed)>

通过这种方式,我将请求排队,以便顺序处理请求而不是同时处理。虽然交易问题消失了,但处理时间增加了,这是意料之中的。

我想知道

  1. serviceThrottling 是否是解决此问题的唯一方法?

  2. 如何设置 serviceThrottling 以使服务同时接受多个请求但一次处理一个?

  3. 是否在此处设置相关的 InstanceContextMode=InstancePerContext.PerCall,因为应用程序是 ASP .Net 应用程序,它本身就是多线程的?

    李>

【问题讨论】:

    标签: asp.net wcf concurrency service transactions


    【解决方案1】:
    1. 好吧,我认为您尝试使用 WCF 限制来解决数据库死锁的方法是错误的。 您应该尝试了解为什么您的数据库操作会导致死锁,并尝试避免它(通过使用可能的锁定提示)。
    2. 单例会按照您的要求执行,但这不是非常可扩展的。
    3. 这是相关的,但我想你明白我的意思,解决数据库中的死锁而不是 WCF。

    如果您正在使用它的 SQL 服务器,那么有一个很棒的工具可以分析死锁(以及更多),它被称为 SQL Profiler。它也是 SQL 联机丛书中一个相当有据可查的主题

    【讨论】:

      【解决方案2】:

      您的更改导致 WCF 服务作为单例实例运行。这解决了您的数据库并发问题,但它只是将进程阻塞推到客户端。

      我建议使用不同的方法来消除客户端阻塞惩罚。您应该考虑制作此服务,或者至少将该操作提取到使用 netMsmqBinding (a good overview is here) 的新服务中。这意味着客户端永远不会被阻塞,它保证将请求传递给服务。权衡是无法立即响应请求,您需要添加另一个操作来轮询完成状态并检索任何预期结果。启动基于 MSMQ 的服务确实需要更多的工作,但可靠性通常值得付出努力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多