Projektowanie, Programowanie, Codzienność – BeniaminZaborski.com

17 Marzec 2015

T-SQL – czy transakcje są atomowe?

Filed under: Sikłelowo — Tags: , , , — 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?

Dodaj komentarz »

Brak komentarzy.

RSS feed for comments on this post. TrackBack URI

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

Blog na WordPress.com.

%d bloggers like this: