Projektowanie, Programowanie, Codzienność – BeniaminZaborski.com

17 marca 2015

T-SQL – czy transakcje są atomowe?

Filed under: Sikłelowo — Tagi: , , , — Beniamin Zaborski @ 22:19

W myśl zasad ACID, które SQL Server spełnia, tak! transakcje są atomowe. A co z poniższym przykładem?


USE tempdb
GO

CREATE TABLE dbo.UZYTKOWNICY (
ID_UZYTKOWNIKA UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
LOGIN VARCHAR(15) NOT NULL UNIQUE
);
GO

BEGIN TRANSACTION
INSERT INTO dbo.UZYTKOWNICY(ID_UZYTKOWNIKA, LOGIN) VALUES(NEWID(), 'Uzytkownik1'); -- OK
INSERT INTO dbo.UZYTKOWNICY(ID_UZYTKOWNIKA, LOGIN) VALUES(NEWID(), 'BardzoDlugiLoginUzytkownika'); -- ERROR
COMMIT

SELECT * FROM dbo.UZYTKOWNICY;
GO

W ramach transakcji wykonuję dwie operacje INSERT. Pierwsza jest OK, natomiast druga operacja próbuje dodać rekord, gdzie wartość wstawiana do kolumny LOGIN jest dłuższa od maksymalnej dopuszczalnej.

Czy transakcja się powiedzie? Atomowość – pamiętacie?

Tak powiedzie się, ale częściowo! SELECT zwróci tylko jeden rekord (ten pierwszy z transakcji). WTF?! Zerknijmy do dokumentacji, a ona na to: „in some cases only the Transact-SQL statement that raised the error is rolled back and the transaction continues processing”.

Można sobie z tym poradzić wykonując SET XACT_ABORT ON przed rozpoczęciem transakcji. Teraz cała nasza transakcja będzie wycofana po napotkaniu błędu. Czyż nie tego oczekiwaliśmy?

Reklamy

Stwórz darmową stronę albo bloga na WordPress.com.