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

发布于 2024-10-21 22:33:31 字数 303 浏览 0 评论 0原文

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

例如,

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

我担心如果有两次创建客户的调用(具有相同的详细信息),我可能会冒在数据库中创建两个客户的风险,而我实际上只期望一个。

有什么方法可以解决这个问题,同时允许我的服务在每次调用时保持不变?

I'm using a WCF service which needs to be a per call service to handle load, but there are certain methods in the service which need to be thread safe.

e.g.

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

I'm worried that if there are two calls to create customer (with the same details), I risk have two customer creating in the database, when I really only expected one.

Is there some way to solve this problem while allowing my service to remain per call?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雪花飘飘的天空 2024-10-28 22:33:31

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

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

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

这会更好您可以编写一个存储过程(例如 CreateCustomerIfNotExists),该过程具有事务并检查某个客户 ID 是否存在,如果不存在,则将在表中插入新行。

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

You are confusing thread safety with database concurrency. PerCall service does not pose thread-safety issues, unless you are spawning multiple threads in your service routine (which you should avoid).

Your question should be rephrased that you are concerned with database consistency and concurrency on the Customer table during an insert (e.g. not seeing a customer that somebody else has created).

There is a very standardized way in a relational database that fulfills the ACID properties (atomicity, consistency, isolation, durability) to deal with this: Wrap the check/insert in a transaction.

It will be better for you to write a stored procedure (say CreateCustomerIfNotExists) that has a transaction and checks if a certain customer ID exists, and will insert a new row into the table if it doesn't exist.

The relational database's ACID properties automatically prevents what you fear from happening.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文