ReadUncommitted不能跨事务工作

时间:2016-06-22 17:54:52

标签: sql sql-server transactions

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

包含列id( IDENTITY)parentId(UNIQUEIDENTIFIER)的表B. 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”的隔离级别&#39;允许第二个事务中的插入读取第一个事务中未提交的内容吗?

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

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

当您进行第二次插入时,发生了什么事情,SQL Server正在尝试检查外键以确保您没有插入您不能插入的内容。但由于您的第一笔交易仍然持有TableA的锁定,您的第二笔交易正在等待。读取未提交无所谓。在插入发生之前必须检查约束,因此它将等待第一个事务完成。如果由于第一个事务尚未提交而未建立锁定,您仍然会违反外键约束。

答案 1 :(得分:0)

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