我有一个分析平台,拥有大量用户,每分钟有数百次插入点击。
有时,我看到完全相同的单击在同一秒内插入到数据库中,并且成为另一个的重复。
我有一个系统,该系统检查表是否具有相同的值,如果找到一个,则不让另一个插入。
但是,在这种情况下,在我看来,它们是在完全相同的毫秒内插入到数据库中的。
我在这里可以做什么?
我的最爱: insert ignore myTable (col1, col2, ...) ...
其中唯一密钥(S)是预先设置禁止插入。似乎您并不在乎先前插入的内容,而您在乎最终结果不是重复的。
注意:唯一键可以是多列键(复合键)
一个警告的词insert ignore
:如果不仔细考虑它对于需要知道该行确实已经存在的敏感系统的后果,则不应实施该警告。对于“确保它在那里”是理想的。
选项B:可以像这里那样研究意图锁,但它是针对您的特定用例而设计的。转向快速的INNODB行级锁定,当然也不要表锁定。大多数事情都需要权衡。锁定的缺点是并发性降低。
选项C:对于胆小的人(有时是我)。这就是我被聘用并希望以后不会受到同行的强烈反对时要做的事情。执行Insert ... on Duplicate Key Update
(IODKU
),并得到一个类似虚假的列touches
,这是您为IODKU的Update部分增加的整数。下面的例子:
insert myTable (col1, col2, col3) values (p1,p2,p3)
on duplicate key update touches=touches+1;
以上将是最简约的形式。下面的视图是C#
我在意“ IODKU的更新部分”中更多列时使用的视图,但仅显示该视图是否有益于任何人:
关于IODKU的最终想法:必须具有唯一的键(主键或唯一键),以引起“冲突”。因此,该语句知道是否执行插入或更新。没有这种独特的键冲突,将插入新行。
回到op问题,您的系统可能已经有该行的原因是由于高并发使用而没有锁定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句