NioLineCount: indent fixed
This commit is contained in:
103
Concurrency Control/SQL - AnomalyBank - 02 - Transaction W.sql
Normal file
103
Concurrency Control/SQL - AnomalyBank - 02 - Transaction W.sql
Normal file
@@ -0,0 +1,103 @@
|
||||
-- This Script is part of the AnomalyBank Series
|
||||
--
|
||||
-- Problem: Inconsistent retrieval
|
||||
--
|
||||
-- Revision History
|
||||
-- 2019.04.09 Karsten Jeppesen (kaje@ucn.dk) initial push
|
||||
-- 2020.03.30 Karsten Jeppesen (kaje@ucn.dk) Spellcheck
|
||||
--
|
||||
-- Anomaly: Inconsistent retrieval
|
||||
--
|
||||
-- PreReq: SQL - AnomalyBank - 01 - Initialize Bank
|
||||
--
|
||||
-- Distributed Systems, Concepts and Design, page 684, Figure 16.6
|
||||
-- The Inconsistent Retrievals Problem, Transaction W
|
||||
-- Start this script no later than 5 secs after Transaction V
|
||||
-- +------------------------------+------------------------------------+
|
||||
-- | Transaction V | Transaction W |
|
||||
-- +------------------------------+------------------------------------+
|
||||
-- | a.withdraw(100); 100 | |
|
||||
-- | | total = a.getBalance( ) 100 |
|
||||
-- | | total = total + b.getBalance() 300 |
|
||||
-- | | total = total + c.getBalance() 500 |
|
||||
-- | b.deposit(100) 200 | |
|
||||
-- +------------------------------+------------------------------------+
|
||||
--
|
||||
-- The Correct Branch balance is 600 NOT 500
|
||||
--
|
||||
-- EXERCISE: Try the different ISOLATION levels.
|
||||
-- SET TRANSACTION ISOLATION LEVEL
|
||||
-- { READ UNCOMMITTED
|
||||
-- | READ COMMITTED
|
||||
-- | REPEATABLE READ
|
||||
-- | SNAPSHOT
|
||||
-- | SERIALIZABLE
|
||||
-- }
|
||||
|
||||
|
||||
USE AnomalyBank
|
||||
-- CHOOSE ONE OF THE FOLLOWING BY UNCOMMENTING
|
||||
--SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
|
||||
--SET TRANSACTION ISOLATION LEVEL READ COMMITTED
|
||||
--SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
|
||||
--SET TRANSACTION ISOLATION LEVEL SNAPSHOT
|
||||
--SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
|
||||
|
||||
-- Nothing to initialize
|
||||
|
||||
-- And here comes The Inconsistent Retrievals Problem
|
||||
|
||||
DECLARE @Balance int
|
||||
DECLARE @Total int
|
||||
DECLARE @Done int = 0;
|
||||
DECLARE @DeadlockErr int = 1205;
|
||||
DECLARE @LockTimeout int = 1222;
|
||||
|
||||
WHILE @Done = 0
|
||||
BEGIN
|
||||
PRINT 'Branch totalling start';
|
||||
BEGIN TRANSACTION T1 WITH MARK N'Branch Total';
|
||||
BEGIN TRY
|
||||
SET @Total = 0;
|
||||
-- total = a.getBalance( )
|
||||
SELECT @Balance=Balance FROM Accounts WHERE Customer='a';
|
||||
SET @Total = @Total + @Balance;
|
||||
-- total = total + b.getBalance()
|
||||
SELECT @Balance=Balance FROM Accounts WHERE Customer='b';
|
||||
SET @Total = @Total + @Balance;
|
||||
-- total = total + c.getBalance()
|
||||
SELECT @Balance=Balance FROM Accounts WHERE Customer='c';
|
||||
SET @Total = @Total + @Balance;
|
||||
PRINT N'Total balance is';
|
||||
PRINT @Total;
|
||||
SET @Done = 1;
|
||||
COMMIT TRANSACTION T1;
|
||||
END TRY
|
||||
BEGIN CATCH
|
||||
if (ERROR_NUMBER() = @DeadlockErr)
|
||||
BEGIN
|
||||
PRINT 'ABORTED BY DEADLOCK';
|
||||
ROLLBACK;
|
||||
CONTINUE;
|
||||
END
|
||||
if (ERROR_NUMBER() = @LockTimeout)
|
||||
BEGIN
|
||||
PRINT 'ABORTED BY LOCK TIMEOUT';
|
||||
ROLLBACK;
|
||||
CONTINUE;
|
||||
END
|
||||
SELECT 'ABORTED BY UNHANDLED ERROR';
|
||||
SET @Done = 1;
|
||||
END CATCH
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
select * FROM Accounts
|
||||
USE master
|
||||
Reference in New Issue
Block a user