我正在使用一个WCF服务,它需要是一个每个调用服务来处理负载,但是服务中有一些需要线程安全的方法。
e.g。
void CreateCustomer(Customer customer)
{
//If customer does not exists in DB
//Create customer
}
我担心如果有两次调用来创建客户(具有相同的详细信息),我冒险在数据库中创建两个客户,当时我真的只期望一个。
有什么方法可以解决这个问题,同时允许我的服务保持每次通话?
答案 0 :(得分:3)
您将线程安全与数据库并发混淆。 PerCall服务不会造成线程安全问题,除非您在服务例程中生成多个线程(您应该避免)。
您的问题应该被重新表述您在插入期间关注Customer表上的数据库一致性和并发性(例如,没有看到其他人创建的客户)。
在关系数据库中有一种非常标准化的方法可以满足ACID属性(原子性,一致性,隔离性,持久性)来处理这个问题:在事务中包装检查/插入。
最好编写一个存储过程(比如CreateCustomerIfNotExists
),该存储过程具有事务并检查是否存在某个客户ID,如果不存在则会在表中插入新行
关系数据库的ACID属性可以自动防止您发生的恐惧。