使用事务隔离级别锁定SQL Server中的数据


咿呀哟
2025-02-10 03:05:34 (1月前)
  1. 我开始开发应该处理的应用程序


数据
</跨度>
访问并发问题,我无法理解如何正确使用事务

隔离
</跨度>
水平。

我有以下 我的交易完成。

在阅读有关SQL Server事务的这篇文章后,我得到了设置的概念

隔离
</跨度>
步骤#1中的Serializable可以帮助我实现这一目标。但对于一些

4 条回复
  1. 0# v-star*위위 | 2019-08-31 10-32



    改变序列化是我只能作为最后的手段。
    在这种情况下,我坚持使用单个事务来更新父ID,但是将代码放在更新触发器中更新文件夹路径。


  2. 1# 敢嫁就敢娶 | 2019-08-31 10-32



    当你使用

    Serializable

    这样做是为了保持

    共享
    </强>
    锁(来自

    SELECT

    )在您已阅读的行上,直到事务完成。但是一行上有共享锁


    </强>
    阻止另一个事务读取同一行……它只是阻止另一个事务获得一个

    独家
    </强>
    锁定该行(共享锁)以进行更新或删除。



    如果你想阻止任何其他交易甚至阅读(

    SELECT

    )在这些行上,你需要强制执行

    独家
    </强>
    当你锁定

    SELECT





    1. SELECT *
      FROM dbo.Folders WITH (XLOCK)
      WHERE ….

    2. </code>


    现在如果

    这个

    交易“保持开放”,

    没有其他
    </强>
    transaction可以读取由其选择的任何行

    WHERE

    条件 - 直到那个

    SELECT .. FROM dbo.Folders WITH (XLOCK)

    事务已提交或回滚。


  3. 2# 無口君 | 2019-08-31 10-32



    如果你执行以下操作,它会完全符合你的要求(阻止读者和作者看到行:
    在第1场会议中:




    1. create table dbo.test(i1 int, a1 varchar(25))
      insert into dbo.test values (1,’NY’),(1,’NY’),(1,’NJ’),(2,’NY’),(2,’NY’),(2,’NJ’)
      set transaction isolation level serializable
      begin transaction
      select * from test where i1=1
      update dbo.test set i1=3 where a1=’NJ

    2. </code>


    在第2次尝试中




    1. select * from dbo.test where i1=1

    2. </code>


    挂….



    添加开始尝试和捕获只能改善的东西,但即使没有它可序列化的工作。您没有向我们展示您的所有代码。


登录 后才能参与评论