当前位置: 首页 > 知识库问答 >
问题:

可序列化的事务隔离级别会创建读锁吗

陶睿
2023-03-14

我似乎无法找到一个简单的问题的直接答案。如果我在 T-SQL 中创建事务并将隔离级别设置为可序列化,这是否会在我正在修改的表上创建读取锁?

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO    
TRUNCATE TABLE TBL_PRODUCTS;
GO
    **INSERT RECORDS HERE**
GO
    COMMIT TRANSACTION;
GO

共有2个答案

祁建明
2023-03-14

是的,它会锁定表,这些是可序列化的规则:

  • 语句无法读取已修改但尚未由其他事务提交的数据。
  • 在当前事务完成之前,任何其他事务都不能修改当前事务已读取的数据。
  • 在当前事务
  • 完成之前,其他事务不能插入具有键值的新行,这些键值将落在当前事务中的任何语句读取的键范围内。

https://msdn.microsoft.com/en-us/library/ms173763.aspx

昝浩阔
2023-03-14

<code>TRUNCATE TABLE</code>将获取<罢工>独家shema修改表上的锁,防止所有用户从表中读取<罢工>(除非他们使用事务隔离级别读取未完成WITH(NOLOCK))和写入表(写入无例外)。独占锁将在COMMIT TRANSACTION处释放。

编辑:正如Martin Smith在下面的评论中指出的那样,截断表将获得一个模式修改锁。这意味着在提交或回滚发生之前,没有其他用户能够读取或修改表。

 类似资料:
  • 我有点理解实体锁定和事务隔离级别的目的,但不能得到悲观锁定和可序列化级别之间的区别。据我所知,在这两种情况下,表都被锁定,其他事务都无法访问它,因此在这两种情况下,防止并发修改的操作都是由DB执行的,看起来没有什么区别。谁能解释一下这里是否真的有区别?

  • 以下链接描述了可序列化事务隔离级别。 http://blogs . msdn . com/b/sqlcat/archive/2011/02/20/concurrency-series-basics-of-transaction-isolation-levels . aspx 假设我有一个用户更新表 另一个用户正在更新表 我想序列化这两个更新语句(意味着在第二个语句开始之前等待第一个完成),尽管我们

  • 我已经阅读了大约4个级别的隔离: 我想了解每个事务隔离在表上使用的锁 以下是事务隔离中可能出现的三种现象 脏读取-无锁定 不可重复读取-无脏读取作为对提交数据的锁定 幻影读取-锁定sql块(使用select query选择) 我想了解我们在哪里定义这些隔离级别:仅在jdbc/hibernate级别或在DB中定义 PS:我已经浏览了oracle中隔离级别的链接,但是它们看起来很笨拙,而且只针对数据库

  • 我试图理解锁定如何与隔离级别一起工作。我已经回答了这个问题,但无法理解给定打击的流 在这里,我在不同的终端中启动两个事务,并在其中读取同一行。当我尝试更新它们时,两个终端都在等待更新。除此之外,没有其他查询正在运行 这是我做的一系列步骤 这是我的第一个问题 这里我想了解为什么两个连接都在等待,以及它们是否是谁拥有更新行的锁? 如果我将上述步骤更改为 在这种情况下,不同的是我可以看到conn1有锁,

  • 本文向大家介绍事务的隔离级别有哪些?相关面试题,主要包含被问及事务的隔离级别有哪些?时的应答技巧和注意事项,需要的朋友参考一下 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重

  • 我有一个对具有 SQL API 的 Cosmos 容器的长期运行查询,该查询需要 10 分钟以上才能完成。有没有办法将数据库的隔离级别设置为“可重复读取”或“可序列化”,以避免幻像读取,如这里所定义的那样? 我知道我们可以为 Cosmos DB 设置一致性级别,但它仅适用于地质副本之间的读/写一致性,而不适用于事务隔离。