2021. 5. 9. 16:10ㆍData science/Database
ACID Commands: Start with "BEGIN" End with "COMMIT"
-> After the transaction, save the new database state
-> If any of the statements fail, you can undo changes by issuing ROLLBACK
-> Can be issued by some languages: Java, C, R, Python
-> to execute SQL statements from code, use the EXEC SQL command
: EXEC SQL COMMIT WORK; EXEC SQL ROLLBACK WORK;
--#SET TERMINATOR @
CREATE PROCEDURE TRANSACTION_ROSE -- Name of this stored procedure routine
LANGUAGE SQL -- Language used in this routine
MODIFIES SQL DATA -- This routine will only write/modify data in the table
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0; -- Host variable SQLCODE declared and assigned 0
DECLARE retcode INTEGER DEFAULT 0; -- Local variable retcode with declared and assigned 0
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- Handler tell the routine what to do when an error or warning occurs
SET retcode = SQLCODE; -- Value of SQLCODE assigned to local variable retcode
UPDATE BankAccounts
SET Balance = Balance-200
WHERE AccountName = 'Rose';
UPDATE BankAccounts
SET Balance = Balance+200
WHERE AccountName = 'Shoe Shop';
UPDATE ShoeShop
SET Stock = Stock-1
WHERE Product = 'Boots';
UPDATE BankAccounts
SET Balance = Balance-300
WHERE AccountName = 'Rose';
IF retcode < 0 THEN -- SQLCODE returns negative value for error, zero for success, positive value for warning
ROLLBACK WORK;
ELSE
COMMIT WORK;
END IF;
END
@ -- Routine termination character
CALL TRANSACTION_ROSE; -- Caller query
SELECT * FROM BankAccounts;
SELECT * FROM ShoeShop;
-> TRANSACTION has not been done successfully. The First 3 update queries were done successfully though, the last one returned the negative values. (As Rose only had 300 in her bank account) So, the last UPDATE statement fails. Since the whole transaction fails if any of the SQL statements fail, the transaction won't be committed and rollback.
Problem
Create a stored procedure TRANSACTION_JAMES to execute a transaction based on the following scenario: First buy James 4 pairs of Trainers from ShoeShop. Update his balance as well as the balance of ShoeShop. Also, update the stock of Trainers at ShoeShop. Then attempt to buy James a pair of Brogues from ShoeShop. If any of the UPDATE statements fail, the whole transaction fails. You will roll back the transaction. Commit the transaction only if the whole transaction is successful.
buy James 4 pairs of Trainers from ShoeShop.
Update balance
update the stock
buy James a pair of Brogues from ShoeShop.
--#SET TERMINATOR @
CREATE PROCEDURE TRANSACTION_JAMES -- Name of this stored procedure routine
LANGUAGE SQL -- Language used in this routine
MODIFIES SQL DATA -- This routine will only write/modify data in the table
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0; -- Host variable SQLCODE declared and assigned 0
DECLARE retcode INTEGER DEFAULT 0; -- Local variable retcode with declared and assigned 0
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION -- Handler tell the routine what to do when an error or warning occurs
SET retcode = SQLCODE; -- Value of SQLCODE assigned to local variable retcode
UPDATE BankAccounts
SET Balance = Balance-1200
WHERE AccountName = 'James';
UPDATE BankAccounts
SET Balance = Balance+1200
WHERE AccountName = 'Shoe Shop';
UPDATE ShoeShop
SET Stock = Stock-4
WHERE Product = 'Trainers';
UPDATE BankAccounts
SET Balance = Balance-150
WHERE AccountName = 'James';
IF retcode < 0 THEN -- SQLCODE returns negative value for error, zero for success, positive value for warning
ROLLBACK WORK;
ELSE
COMMIT WORK;
END IF;
END
@ -- Routine termination character
-> The last update query -> fail -> rollback