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

时间:2016-08-22 10:21:02

标签: sql-server transactions transactionscope

我想在2个不同的表中插入两行,但是如果满足第二个表上的某些前置条件,则想要回滚事务。

是否在.NET中工作如果我只是在执行insert语句之前启动事务范围并执行sql查询来检查第二个表上的数据?如果是这样,使用什么隔离级别?

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

由于

1 个答案:

答案 0 :(得分:0)

是的,你可以在执行insert语句之前执行sql查询来检查第二个表上的数据。

Fyi默认为Serializable。来自MSDN

  

最低隔离级别ReadUncommitted允许许多事务   同时在数据存储上运行并且不提供保护   防止由于中断事务导致的数据损坏。最高的   隔离级别,Serializable,提供高度保护   针对中断交易,但要求每笔交易   在任何其他交易被允许操作之前完成   数据

     

事务的隔离级别是在确定时确定的   交易已创建。默认情况下,System.Transactions   基础架构创建Serializable事务。你可以确定   使用。的现有事务的隔离级别   事务的IsolationLevel属性。

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

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

Transaction isolation levels relation with locks on table