如何使用Web服务在没有竞争条件的情况下在DB中写入?

时间:2012-12-07 21:56:08

标签: c# mysql web-services web

我在c#

中编写了一个简单的Web服务(asmx)

客户端使用post和title参数访问webservice,并期望服务返回一个对象,其中包含有关该标题密钥的更多详细信息。

我面临的问题是,在我的网络服务的执行开始时,我检查是否提供给我的标题存在于我的数据库中。如果不是我构造正确的对象我将它保存到我的数据库,以便将来搜索,以避免重建它(因为我使用第三方Web服务进行构建)然后我在json中发回客户端询问的对象对

然而,这会导致竞争条件,因为2个客户端可能会要求相同的标题并最终向数据库插入两次相同的对象,因为其中一个对象在另一个要求之前写入对象的速度不够快。

我使用Mysql数据库,我想弄清楚如何避免这种竞争条件?

密钥是存储过程吗?

我该如何解决这个问题?

注意:我的数据库中的键是标题列和年份列。

提前致谢

2 个答案:

答案 0 :(得分:4)

您可以在列上添加SQL Server UNIQUE约束以强制唯一性。如果出现竞争条件,您可以通过捕获它并简单地再次查询标题来处理服务代码中的错误(来自约束)。

答案 1 :(得分:1)

在数据库中的标题上放置一个唯一键(或者标题的哈希值可能更快)。 第二次调用将获得DUPLICATE KEY异常,即使第一次尝试选择该行时该行也不存在。