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;