如何使用WCF PerCall服务保护资源

时间:2011-03-14 04:40:54

标签: c# multithreading wcf

我正在使用一个WCF服务,它需要是一个每个调用服务来处理负载,但是服务中有一些需要线程安全的方法。

e.g。

void CreateCustomer(Customer customer)
{
//If customer does not exists in DB
   //Create customer
}

我担心如果有两次调用来创建客户(具有相同的详细信息),我冒险在数据库中创建两个客户,当时我真的只期望一个。

有什么方法可以解决这个问题,同时允许我的服务保持每次通话?

1 个答案:

答案 0 :(得分:3)

您将线程安全与数据库并发混淆。 PerCall服务不会造成线程安全问题,除非您在服务例程中生成多个线程(您应该避免)。

您的问题应该被重新表述您在插入期间关注Customer表上的数据库一致性和并发性(例如,没有看到其他人创建的客户)。

在关系数据库中有一种非常标准化的方法可以满足ACID属性(原子性,一致性,隔离性,持久性)来处理这个问题:在事务中包装检查/插入。

最好编写一个存储过程(比如CreateCustomerIfNotExists),该存储过程具有事务并检查是否存在某个客户ID,如果不存在则会在表中插入新行

关系数据库的ACID属性可以自动防止您发生的恐惧。