2016-06-22 4 views
0

Ich habe zwei Tabellen: TableA mit Spalten id(UNIQUEIDENTIFIER) und name(NVARCHAR) (verwendet NEWSEQUENTIALID() um automatisch generieren Werte für 'id' Spalte)READUNCOMMITTED funktioniert nicht über Transaktionen

TableB mit Säulen id(IDENTITY), parentId(UNIQUEIDENTIFIER). parentId in TabelleB hat eine Fremdschlüsseleinschränkung für TableA id.

Ich versuche, die die folgenden Abfragen ausführen:

In Session 1:

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

Bitte beachte, dass ich nicht will, die Transaktion hier noch begehen.

In Session 2: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION test2 INSERT INTO dbo.TableB(parentId) VALUES('<use_id_from_session1_here>')

Der zweite Einsatz scheitert auch auszuführen und auflegt in SQL Server Management Studio und in meinem Anwendungscode. Sollte das Setzen einer Isolationsstufe von 'ReadUncommitted' nicht erlauben, dass die Einfügung in der zweiten Transaktion liest, was in der ersten nicht festgeschrieben wurde?

Fehle ich etwas hier oder die Art und Weise, wie ich die Transaktionsisolationsebene falsch verwende?

Irgendwelche Vorschläge würden geschätzt.

Antwort

2

Wenn Sie die zweite Einfügung durchführen, versucht SQL Server, den Fremdschlüssel zu überprüfen, um sicherzustellen, dass Sie nichts einfügen, was nicht möglich ist. Aber da die Sperre für TableA immer noch von Ihrer ersten Transaktion gehalten wird, wartet Ihre zweite Transaktion. Unbefugtes Lesen ist dort nicht wichtig. Constraints müssen überprüft werden, bevor eine Einfügung stattfinden kann, so dass auf die erste Transaktion gewartet wird. Sie würden immer noch die Einschränkung für den Fremdschlüssel verletzen, wenn die Sperre nicht vorhanden wäre, weil die erste Transaktion noch nicht festgeschrieben wurde.

+0

, die absolut Sinn machen nicht begrenzen! Gibt es das überhaupt, kann ich das umgehen, indem ich vielleicht die Fremdschlüssel-Beschränkung beibehalten kann? – user3638992

+0

Was genau versuchst du zu tun? Und warum? Das wird mir helfen zu verstehen, was Sie möglicherweise tun können. –

+1

Kein Weg, weil Sie die referentielle Integrität verletzen könnten, wenn es einen Weg gäbe. Ihr Design erscheint fehlerhaft @ user3638992. Übergreifender Zugriff auf die gleichen Daten ist sehr gefährlich und brüchig. – usr

0

Sie könnten jeden einzelnen Einsatz in Session 1, oder jeden einig Charge einer Größe verpflichten, die über Wartezeit von Sitzung 2