CREATE TABLE Booking (ID INT IDENTITY(1,1), SeatID INT, CustomerID CHAR(1))INSERT Booking SELECT 1, NULLINSERT Booking SELECT 2, NULL
ALTER DATABASE MyDevSET ALLOW_SNAPSHOT_ISOLATION OFF;ALTER DATABASE MyDevSET READ_COMMITTED_SNAPSHOT OFF;
BEGIN TRANSACTION-- Book seat 1 if it's not already takenIF NOT EXISTS (SELECT 1 FROM Booking WHERE SeatID = 1 AND CustomerID IS NOT NULL)BEGIN UPDATE Booking SET CustomerID = 'A' WHERE SeatID = 1END-- Now let say we need to do something else as part of the booking transaction which -- takes some considerate amount of time for this Customer-- do not commit for now!
BEGIN TRANSACTION-- Book seat 1 if it's not already taken (and it's not as transaction for Customer A is not committed as yet).IF NOT EXISTS (SELECT 1 FROM Booking WHERE SeatID = 1 AND CustomerID IS NOT NULL)BEGIN UPDATE Booking SET CustomerID = 'B' WHERE SeatID = 1END-- Now let say that "something else - part" for Customer "B" takes no time and transaction is completed, so:COMMIT TRANSACTION
SELECT * FROM Booking
ALTER DATABASE MyDevSET ALLOW_SNAPSHOT_ISOLATION ONALTER DATABASE MyDevSET READ_COMMITTED_SNAPSHOT ON
BEGIN TRANSACTION-- Book seat 1 if it's not already taken (and it's not as transaction for Customer A is not committed as yet).UPDATE Booking SET SeatNo = 1 WHERE Customer ='B' AND NOT EXISTS(SELECT 1 FROM Booking WHERE SeatNo = 1) -- seat is not booked yet.-- Now let say that "something else - part" for Customer "B" takes no time and transaction is completed, so:COMMIT TRANSACTION