我有两张桌子:
包含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;允许第二个事务中的插入读取第一个事务中未提交的内容吗?
我在这里遗漏了什么,或者我使用/设置事务隔离级别的方式不正确?
任何建议都将不胜感激。
答案 0 :(得分:2)
当您进行第二次插入时,发生了什么事情,SQL Server正在尝试检查外键以确保您没有插入您不能插入的内容。但由于您的第一笔交易仍然持有TableA的锁定,您的第二笔交易正在等待。读取未提交无所谓。在插入发生之前必须检查约束,因此它将等待第一个事务完成。如果由于第一个事务尚未提交而未建立锁定,您仍然会违反外键约束。
答案 1 :(得分:0)
您可能会在会话1中提交每个插入,或者每个批量的大小都不会限制会话2的等待时间