2011-03-14 93 views
0

我正在使用WCF服务,该服务需要是每个呼叫服务来处理负载,但服务中有某些方法需要线程安全。如何使用WCF PerCall服务保护资源

例如

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

我很担心,如果有两个呼叫创造客户(以相同的细节),我的风险有两个客户在数据库中创建,当我真的只希望之一。

有没有办法解决这个问题,同时让我的服务保持每个呼叫?

+0

如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)以精确地设置格式和语法突出显示它! – 2011-03-14 06:13:56

+0

您如何知道客户存在两次?您数据库中的客户编号字段?只要在它上面加一个'UNIQUE'约束!这样,无论有多少并发呼叫尝试创建该客户,只有一个可以存在于您的数据库中 – 2011-03-14 06:15:20

回答

3

您正在混淆线程安全性与数据库并发性。 PerCall服务不会引起线程安全问题,除非您在服务例程中产生多个线程(您应该避免这种情况)。

您的问题应该改写为您在插入期间关注客户表上的数据库一致性和并发性(例如,未查看其他人创建的客户)。

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

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

关系数据库的ACID属性会自动防止您害怕发生的事情。