在压力下确保 SQL 数据库中的唯一行插入
SQL 开发人员面临的一个常见挑战是插入行而不创建重复项。 传统方法经常涉及子查询:
<code class="language-sql">INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey)</code>
但是,在重负载下,这种方法可能会导致主键违规,从而损害语句原子性。
为了缓解这种情况,一些开发人员采用了锁定机制:
<code class="language-sql">INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey)</code>
但是过多的锁定会显着影响性能。
一种更高效的策略,通常称为“JFDI”(Just F***ing Do It)方法,涉及直接插入和错误处理:
<code class="language-sql">BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 RAISERROR etc END CATCH</code>
这避免了嵌套查询和锁定,从而提高了大容量下的并发性。
至关重要的是,正确的索引至关重要。 正如经验丰富的 SQL 开发人员在“第 4 课”中强调的那样,仅依靠子查询来防止重复是不可靠的。 唯一的索引加上适当的错误处理(例如捕获错误 2627),可提供自动重复预防,从而简化流程。
以上是SQL开发人员如何确保高负载下唯一的行插入?的详细内容。更多信息请关注PHP中文网其他相关文章!