Answers:
我不认为您的问题确实与数据库无关。正确的答案可能取决于实施细节,具体细节可能因供应商而异,并且随着下一个版本的变化而变化。在任何RDBMS上选择任何方法之前,我都会在并发下进行测试。
现在,在SQL Server 2008 R2上,我正在使用以下内容:
低并发性和低修改量。要保存一行,我使用sp_getapplock进行序列化并使用MERGE。我强调在高并发下进行测试以验证其是否有效。
更高的并发性和/或数量。为了避免并发和提高性能,我不会一次保存一行。我在我的应用服务器上累积更改,并使用TVP保存批次。尽管如此,为避免并发相关问题,我在合并之前使用sp_getapplock进行了序列化。同样,我在高并发性下进行压力测试以验证其是否有效。
结果,我们在生产中具有良好的性能和与零并发相关的问题:无死锁,无PK /唯一约束违规等。
让数据库引发一个错误。
先进行测试对于并发并不安全,因为最终会导致冲突,因为两个线程可能会通过“ NOT EXIST”,并且两个线程都将尝试写入。这适用于“ READ COMMITTED”和MVCC / Snapshot锁定策略。
您可以使用锁定提示来强制隔离,但会降低性能。
我将其称为JFDI模式(SO链接)。对于“如果存在则更新”,请在此处查看:需要帮助Sql Server 2005死锁方案进行故障排除。这些是SQL Server。MySQL具有INSERT IGNORE,可以很好地处理这个问题。不确定其余
MERGE
可能解决了Paul的观察,但是我还没有以高tx率对其进行测试。主要是因为我尚未训练我的大脑来理解该语法。