首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发处理服务

并发处理服务
EN

Stack Overflow用户
提问于 2015-03-17 14:13:03
回答 2查看 63关注 0票数 0

我有从不同进程调用的方法,有时是并发的。在那个方法的某个地方,我应该计算折扣。为此,我创建了一个DiscountService,它从DB读取信息并计算给定客户号的折扣。如前所述,主方法可以同时从具有不同客户号的不同位置调用。

主要方法:

代码语言:javascript
复制
// this may be called simultaneously
public void Handle(IDocument document)
{
  // document contains customer number
  ...
  // update document discount property
  this._discountService.Process(document);
  // continue processing

DiscountService:

代码语言:javascript
复制
public class DiscountService : IDiscountService
{
    private readonly IDiscountDataAccess discountDataAccess;

    private readonly ILog logger;

    public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
    {
        this.discountDataAccess = discountDataAccess;
        this.logger = logger;
    }

    public void Process(IDiscountDocument discountDocument)
    {
        this.ProcessDiscount(discountDocument);
        discountDocument.Update();
    }

    private void ProcessDiscount(IDiscountDocument discountDocument)
    {
        Discount discount = this.GetAvailableDiscount(discountDocument);
        ...
    }
    private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
    {
        // Stored proc 
        return this.discountDataAccess.GetAvailableDiscount(
            discountDocument.CustomerNumber, 
            discountDocument.StartDate, 
            discountDocument.EndDate);
    }
    ...
}

我的问题是我的DiscountService是否应该是线程安全的?如果是这样的话,我将如何处理这种情况。或者,我是否需要某种类型的管理器,为每个主方法调用“新”DiscountService?还是这样就够了?

谢谢

编辑:有没有这样做的模式。有一种服务可以(同时)运作?

是否有一本书,pluralsight视频,谈论这样的东西的设计/模式?给出例子?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-17 14:25:15

通常,如果您从DB中读取一些给定ID的内容,从您检索的数据中可以计算出所需的所有内容,那么就不需要线程安全了,因为您没有共享内存访问权限。

您的文章中不清楚的是提供的discountDocument是否是从多个线程访问的,或者它是否只存在于请求处理的时间之外。

从我可以看到的情况来看,我假设discountDocument需要线程安全(在对象中,但这只是猜测,因为我不知道它还会发生什么),但是服务还是一样的好。

票数 3
EN

Stack Overflow用户

发布于 2015-03-17 14:33:39

从您的代码中,您正在使用discountDataAccess进行依赖注入:

代码语言:javascript
复制
public DiscountService(ILog logger, IDiscountDataAccess discountDataAccess)
{
    this.discountDataAccess = discountDataAccess;
    this.logger = logger;
}

然后,您将使用这个注入的服务,如下所示:

代码语言:javascript
复制
private Discount GetAvailableDiscount(IDiscountDocument discountDocument)
{
    // Stored proc 
    return this.discountDataAccess.GetAvailableDiscount(
        discountDocument.CustomerNumber, 
        discountDocument.StartDate, 
        discountDocument.EndDate);
}

因此,对我来说,结论是discountDataAccess必须是线程安全的,或者至少是可获得的折扣。创建或重用现有连接的可能性很大,如果没有保护机制,则会遇到问题。

DiscountDocument是通过请求传入的,我假设每个请求都有不同的文档,所以在DiscountDocument中不太可能出现问题。

但是,如果discountDocument确实也是一个共享资源,那么它可能需要自己的一些锁定,然后问题会越来越大,因为在这种情况下可能会出现死锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29101367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档