Warum einen TSQL-Anweisungsblock einfügen, wenn die Transaktionsisolationsstufe für eine andere Transaktion mit einem nicht widersprüchlichen Filter serialisierbar ist?

Serialisierbare Transaktionsisolationsstufen vermeiden das Problem des Phantom-Lesens, indem alle Einfügungen in eine Tabelle in einer Transaktion blockiert werden, die mit ausgewählten Anweisungen in anderen Transaktionen in Konflikt stehen. Ich versuche es mit einem Beispiel zu verstehen, aber es blockiert das Einfügen, auch wenn der Filter in der select-Anweisung nicht in Konflikt steht. Ich würde mich über eine Erklärung darüber freuen, warum es sich so verhält.

Table Script

CREATE TABLE [dbo].[dummy](
    [firstname] [char](20) NULL,
    [lastname] [char](20) NULL
) ON [PRIMARY]

GO

Session

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
begin tran
select * from dummy where firstname = 'abc'

Session - 2

insert into dummy values('lmn', 'lmn') -- Why this blocks?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage