【问题标题】:MSSQL how to properly Lock rows and insert?MSSQL如何正确锁定行和插入?
【发布时间】:2016-08-22 10:21:01
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: sql-server transactions transactionscope


    【解决方案1】:

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

    仅供参考,默认为可序列化。来自MSDN

    最低的隔离级别,ReadUncommitted,允许许多事务 同时对数据存储进行操作且不提供保护 防止由于中断事务导致的数据损坏。最高的 隔离级别,Serializable,提供高度保护 反对中断事务,但要求每个事务 在任何其他事务被允许在 数据。

    事务的隔离级别是在 事务被创建。默认情况下,System.Transactions 基础设施创建可序列化事务。你可以确定 现有事务的隔离级别使用 事务的 IsolationLevel 属性。

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

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

    Transaction isolation levels relation with locks on table

    【讨论】:

      猜你喜欢
      • 2013-03-22
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多