MSSQL 如何正确锁定行和插入?

MSSQL how to properly Lock rows and insert?

我想在 2 个不同的 table 中插入两行,但如果满足第二个 table 的某些先决条件,我想回滚事务。

如果我只是启动一个事务范围并在执行插入语句之前执行 sql 查询以检查第二个 table 上的数据,它在 .NET 中是否有效?如果是这样,要使用什么隔离级别?

我不希望它锁定整个 table,因为会有很多插入。 UNIQUE 约束不是一个选项,因为我想做的是保证第二个 table 中不超过 2 行具有相同的值(FK 到 table 1 的 PK 列)

谢谢

是的,您可以在执行插入语句之前执行 sql 查询以检查第二个 table 上的数据。

仅供参考,默认是可序列化的。来自 MSDN:

The lowest isolation level, ReadUncommitted, allows many transactions to operate on a data store simultaneously and provides no protection against data corruption due to interruptive transactions. The highest isolation level, Serializable, provides a high degree of protection against interruptive transactions, but requires that each transaction complete before any other transactions are allowed to operate on the data.

The isolation level of a transaction is determined when the transaction is created. By default, the System.Transactions infrastructure creates Serializable transactions. You can determine the isolation level of an existing transaction using the IsolationLevel property of a transaction.

根据您的要求,我认为您不想使用 Serializable,因为它对大容量多用户系统最不友好,因为它们会导致最多的阻塞。

您需要决定所需的保护量。至少,您应该查看 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ。以下答案详细介绍了隔离级别。由此,您可以决定什么级别的保护足以满足您的要求。

Transaction isolation levels relation with locks on table