我有一个表并且正在运行多个进程,在晚上8点应该将一行插入到数据库中。所有进程都将检测到何时是晚上8点并尝试插入行,但只应插入一行。
我想知道如何确保它只插入一次。
所以例如它会做(pseudosql):
select * from myTable where criteria=something
if no results, insert into myTable values criteria=something
这可能会同时执行多次。
是否有一种简单的方法可以确保如果已经有criteria=something
的记录表明插入内容无效?
基本上将上面的伪代码放入一个阻止其他东西甚至执行select的事务中都可以工作,因为第二个事务必须等到第一个事务才进行第一次选择,这样可以确保第一个选择返回结果......但似乎......俗气!
遗憾的是,我无法使用唯一约束,因为有时会出现多个条目,但设置了“失败”或“已处理”标志。
答案 0 :(得分:-1)
您的伪SQL受竞争条件限制,因此无法确保唯一性。大多数数据库都有一个名为唯一约束的概念,专门用于此目的。在作为第一方的事务插入行之后,所有其他事务在尝试插入相同数据时将获得异常,因此只需优雅地处理这些异常即可。