我使用的是WCF服务,它需要是每个调用的服务来处理负载,但是服务中的某些方法需要是线程安全的。
例如:
void CreateCustomer(Customer customer)
{
//If customer does not exists in DB
//Create customer
}我担心如果有两个创建客户的调用(具有相同的详细信息),我会冒着在数据库中创建两个客户的风险,而我实际上只希望有一个客户。
有没有办法解决这个问题,同时允许我的服务保留在每个调用中?
发布于 2011-03-14 12:49:02
您混淆了线程安全性和数据库并发性。PerCall服务不会造成线程安全问题,除非您在服务例程中派生多个线程(应该避免)。
您的问题应该被重新表述为,在插入期间,您关心数据库一致性和Customer表上的并发性(例如,看不到其他人创建的客户)。
在关系数据库中有一种非常标准化的方法来满足ACID属性(原子性、一致性、隔离性、持久性)来处理这个问题:在事务中包装检查/插入。
更好的做法是编写一个具有事务的存储过程(比如CreateCustomerIfNotExists),并检查某个客户ID是否存在,如果不存在,则将新行插入到表中。
关系数据库的ACID属性会自动阻止您担心的事情发生。
https://stackoverflow.com/questions/5294802
复制相似问题