【问题标题】:ReadUncommitted not working across transactionsReadUncommitted 不能跨事务工作
【发布时间】:2016-06-23 02:38:37
【问题描述】:

我有两张桌子: 包含id(UNIQUEIDENTIFIER)name(NVARCHAR) 列的表A(使用NEWSEQUENTIALID() 自动生成'id' 列的值)

TableB 包含 id( IDENTITY)parentId(UNIQUEIDENTIFIER) 列。 TableB 中的parentId 对TableA id 有一个外键约束。

我正在尝试执行以下查询:

在会话 1 中:

BEGIN TRAN test1 INSERT INTO dbo.TableA( name ) OUTPUT INSERTED.id VALUES ('foo')

请注意,我还不想在这里提交事务。

在会话 2 中: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION test2 INSERT INTO dbo.TableB(parentId) VALUES('<use_id_from_session1_here>')

第二次插入失败并在 SQL Server Management Studio 和我的应用程序代码中挂起。 不应该将隔离级别设置为“ReadUncommitted”以允许第二个事务中的插入读取第一个事务中未提交的内容吗?

我在这里遗漏了什么还是我使用/设置事务隔离级别的方式不正确?

任何建议将不胜感激。

【问题讨论】:

    标签: sql sql-server transactions


    【解决方案1】:

    当您进行第二次插入时,SQL Server 正在尝试检查外键以确保您没有插入您不能插入的内容。但是由于 TableA 上的锁仍然由您的第一个事务持有,因此您的第二个事务正在等待。读取未提交在那里无关紧要。在插入之前必须检查约束,因此它将等待第一个事务完成。如果由于第一个事务尚未提交而未到位,您仍然会违反外键约束。

    【讨论】:

    • 这很有意义!无论如何我可以在保持外键约束不变的情况下解决这个问题吗?
    • 你到底想做什么?为什么?这将帮助我了解您可以做什么。
    • 没有办法解决这个问题,因为如果有办法,您可能会违反参照完整性。您的设计似乎有缺陷@user3638992。跨事务访问相同的数据真的很危险而且很脆弱。
    • 我更正了我在应用程序逻辑中所做的事情。我将设计更改为使用单个事务,而不是跨事务访问相同的数据。
    【解决方案2】:

    您可能会提交会话 1 中的每一个插入,或者每个批次的大小不会过多限制会话 2 的等待时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 2021-11-28
      • 2017-12-28
      • 2013-01-11
      • 2010-10-02
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多