Projektowanie, Programowanie, Codzienność – BeniaminZaborski.com

26 marca 2015

Messaging, czyli pierwsi będą pierwszymi

Filed under: Codzienne dylematy modelarza — Tagi: , , , , — Beniamin Zaborski @ 22:24

Ostatnio zrobiłem przegląd rozwiązań „messagingowych” dla .NET pod kątem użycia w CQRS + ES. Nie wypadało nie zacząć od „rodzimego” MSMQ. Tu niewiele się zmieniło od mojego ostatniego kontaktu z tą technologią. Ostatecznie moją uwagę najbardziej przykuło jedno rozwiązanie: RabbitMQ. Dlaczego? Zalety: otwarte, darmowe, stosunkowo proste w użyciu, multiplatformowe, z client API dla wielu języków w tym oczywiście i dla C#. I najważniejsze – to działa!;). Z tym client API to może, yyy … nie jest najfajniejsze, ale … od czego jest EasyNetQ?
Kolejna zaleta jest taka, że RabbitMQ jest już trochę na rynku i wydaje się mieć na nim ugruntowaną pozycję. Dla mnie bomba, zobaczymy dalej;).

Reklamy

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?

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