当多个线程同时尝试时,如何确保插入一行?

时间:2015-03-27 15:14:43

标签: sql

我有一个表并且正在运行多个进程,在晚上8点应该将一行插入到数据库中。所有进程都将检测到何时是晚上8点并尝试插入行,但只应插入一行。

我想知道如何确保它只插入一次。

所以例如它会做(pseudosql):

select * from myTable where criteria=something

if no results, insert into myTable values criteria=something

这可能会同时执行多次。

是否有一种简单的方法可以确保如果已经有criteria=something的记录表明插入内容无效?

基本上将上面的伪代码放入一个阻止其他东西甚至执行select的事务中都可以工作,因为第二个事务必须等到第一个事务才进行第一次选择,这样可以确保第一个选择返回结果......但似乎......俗气!

遗憾的是,我无法使用唯一约束,因为有时会出现多个条目,但设置了“失败”或“已处理”标志。

1 个答案:

答案 0 :(得分:-1)

您的伪SQL受竞争条件限制,因此无法确保唯一性。大多数数据库都有一个名为唯一约束的概念,专门用于此目的。在作为第一方的事务插入行之后,所有其他事务在尝试插入相同数据时将获得异常,因此只需优雅地处理这些异常即可。