Transactions
============
A transaction is a sequence of statements that are treated as one unit; either all of them occur or none of them.

Syntax and features vary somewhat based on the DBMS.

Classic example: moving money from one bank account to another.

Autocommit mode:
	Every statement is treated as a transaction of its own.
	Most DBMSs have autocommit mode on by default.

To do a multi-statement transaction: BEGIN...COMMIT

Systems support various means to explicitly ROLLBACK a transaction using if statements, etc.

SQLite Example:
---------------
CREATE TABLE Customers(
	CustomerID INTEGER PRIMARY KEY,
	Name TEXT NOT NULL
);

CREATE TABLE Accounts(
	AccountID INTEGER PRIMARY KEY,
	CustomerID INTEGER NOT NULL,
	Balance INTEGER NOT NULL,
	FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID),
	CHECK (Balance >= 0)  /* Enforces a constraint that no account may be overdrawn. */
);

INSERT INTO Customers (Name) VALUES("DrKow");
INSERT INTO Accounts (CustomerID, Balance) VALUES(1,1000);
INSERT INTO Accounts (CustomerID, Balance) VALUES(1,2000);

/* This statement is a single-line transaction; since it failed for one row, it will not modify any rows. */
UPDATE Accounts SET Balance = Balance - 1500;

BEGIN;
	UPDATE OR ROLLBACK Accounts SET Balance = Balance + 50 WHERE AccountID=1;
	UPDATE OR ROLLBACK Accounts SET Balance = Balance / 0 WHERE AccountID=1;   /* This makes it crash, but the transaction is safely rolled back. */
	UPDATE OR ROLLBACK Accounts SET Balance = Balance - 50 WHERE AccountID=2;
COMMIT;

/* The following command will also be rolled back, because the non-negative balance constraint would be violated.  */
BEGIN;
	UPDATE OR ROLLBACK Accounts SET Balance = Balance + 5000 WHERE AccountID=1;
	UPDATE OR ROLLBACK Accounts SET Balance = Balance - 5000 WHERE AccountID=2;
COMMIT;

/* Note that the "OR ROLLBACK" part is required in SQLite; if you run the command above without it, 5000 will be added to one account without deducting it from the other. */

SELECT Name,AccountID,Balance FROM Customers JOIN Accounts ON Customers.CustomerID=Accounts.CustomerID;
