170 lines
4.7 KiB
Markdown
170 lines
4.7 KiB
Markdown
|
|
# SQL Transaction Control
|
||
|
|
|
||
|
|
Transaction Control Language (TCL) manages transactions within a database, ensuring data consistency and reliability. A transaction is a logical unit of work comprising one or more SQL statements, executed co-relationally against data.
|
||
|
|
|
||
|
|
## TCL Commands
|
||
|
|
|
||
|
|
- `COMMIT`
|
||
|
|
- `ROLLBACK`
|
||
|
|
- `SAVEPOINT`
|
||
|
|
|
||
|
|
## COMMIT
|
||
|
|
|
||
|
|
The `COMMIT` command final izes a transaction. All data modifications made within the transaction become permanent and visible to other database sessions. Executing `COMMIT` guarantees data persistence up to that point.
|
||
|
|
|
||
|
|
### Syntax
|
||
|
|
|
||
|
|
```sql
|
||
|
|
COMMIT;
|
||
|
|
```
|
||
|
|
|
||
|
|
## ROLLBACK
|
||
|
|
|
||
|
|
`ROLLBACK` discards all changes made since the transaction started or since the last `SAVEPOINT`. It restores the database to a previous state, effectively undoing operations within the transaction. This is crucial for error handling and partial transaction reversal.
|
||
|
|
|
||
|
|
### Syntax
|
||
|
|
|
||
|
|
```sql
|
||
|
|
ROLLBACK TO savepoint-name;
|
||
|
|
```
|
||
|
|
*Note: Without the `TO savepoint-name` clause, `ROLLBACK` undoes the entire current transaction.*
|
||
|
|
|
||
|
|
## SAVEPOINT
|
||
|
|
|
||
|
|
A `SAVEPOINT` establishes a marker within a transaction. You can `ROLLBACK` to a specific savepoint, partially undoing changes while retaining prior modifications within the same transaction. This allows fine-grained control over transaction scope.
|
||
|
|
|
||
|
|
### Syntax
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SAVE POINT savepoint-name;
|
||
|
|
```
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
Using the `purchase` table to demonstrate TCL command behavior.
|
||
|
|
|
||
|
|
| item | price | customer_name |
|
||
|
|
|--------------|-------|---------------|
|
||
|
|
| Pen | 10 | Troy |
|
||
|
|
| Bag | 1000 | Troy |
|
||
|
|
| Vegetables | 500 | Troy |
|
||
|
|
| Shoes | 5000 | Troy |
|
||
|
|
| Water Bottle | 800 | XYZ |
|
||
|
|
| Mouse | 120 | ABC |
|
||
|
|
| Sun Glasses | 1350 | ABC |
|
||
|
|
|
||
|
|
Update the price of "Pen" from 10 to 20.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
UPDATE purchase SET price = 20 WHERE item = "Pen";
|
||
|
|
```
|
||
|
|
|
||
|
|
Output indicates success. The change is applied (though not necessarily permanent yet depending on database settings). ```
|
||
|
|
Query OK, 1 row affected (...)
|
||
|
|
```
|
||
|
|
|
||
|
|
View the updated table state.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT * FROM purchase;
|
||
|
|
```
|
||
|
|
|
||
|
|
| item | price | customer_name |
|
||
|
|
|--------------|-------|---------------|
|
||
|
|
| Pen | 20 | Troy |
|
||
|
|
| Bag | 1000 | Troy |
|
||
|
|
| Vegetables | 500 | Troy |
|
||
|
|
| Shoes | 5 000 | Troy |
|
||
|
|
| Water Bottle | 800 | XYZ |
|
||
|
|
| Mouse | 120 | ABC |
|
||
|
|
| Sun Glasses | 1350 | ABC |
|
||
|
|
|
||
|
|
Begin a transaction explicitly (some databases default to autocommit).
|
||
|
|
|
||
|
|
```sql
|
||
|
|
START TRANSACTION;
|
||
|
|
```
|
||
|
|
|
||
|
|
Commit the changes made so far within this explicit or implicit transaction. This makes the "Pen" price update (10 to 20) permanent.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
COMMIT;
|
||
|
|
```
|
||
|
|
|
||
|
|
Attempting to rollback now has no effect on the committed transaction.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
ROLLBACK;
|
||
|
|
```
|
||
|
|
|
||
|
|
Querying the table shows the committed change persists.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT * FROM purchase;
|
||
|
|
```
|
||
|
|
|
||
|
|
| item | price | customer_name |
|
||
|
|
|--------------|-------|---------------|
|
||
|
|
| Pen | 20 | Troy |
|
||
|
|
| Bag | 1000 | Troy |
|
||
|
|
| Vegetables | 500 | Troy |
|
||
|
|
| Shoes | 5000 | Troy |
|
||
|
|
| Water Bottle | 800 | XYZ |
|
||
|
|
| Mouse | 120 | ABC |
|
||
|
|
| Sun Glasses | 1350 | ABC |
|
||
|
|
|
||
|
|
Create a savepoint named `sv_update` in the current transaction. Changes before this point are protected from rollbacks targeting this savepoint.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SAVEPOINT sv_update;
|
||
|
|
```
|
||
|
|
|
||
|
|
Update the price of "Pen" again, from 20 to 30. This change occurs after the `sv_update` savepoint .
|
||
|
|
|
||
|
|
```sql
|
||
|
|
UPDATE purchase SET price = 30 WHERE item = "Pen";
|
||
|
|
```
|
||
|
|
|
||
|
|
Output indicates success.
|
||
|
|
```
|
||
|
|
Query OK, 1 row affected (...)
|
||
|
|
```
|
||
|
|
|
||
|
|
View the table state showing the new price (30).
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT * FROM purchase;
|
||
|
|
```
|
||
|
|
|
||
|
|
| item | price | customer_name |
|
||
|
|
|--------------|-------|---------------|
|
||
|
|
| Pen | 30 | Troy |
|
||
|
|
| Bag | 1000 | Troy |
|
||
|
|
| Vegetables | 500 | Troy |
|
||
|
|
| Shoes | 5000 | Troy |
|
||
|
|
| Water Bottle | 800 | XYZ |
|
||
|
|
| Mouse | 120 | ABC |
|
||
|
|
| Sun Glasses | 1350 | ABC |
|
||
|
|
|
||
|
|
Rollback the transaction specifically to the `sv_update` savepoint. This undoes the price change from 20 to 30, but *not* the prior change from 10 to 20 because it was committed.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
ROLLBACK to sv_update;
|
||
|
|
```
|
||
|
|
|
||
|
|
Querying the table shows the state after the partial rollback. The price of "Pen" is restored to 20, as this was the state at the `sv_update` savepoint.
|
||
|
|
|
||
|
|
```sql
|
||
|
|
SELECT * FROM purchase;
|
||
|
|
```
|
||
|
|
|
||
|
|
| item | price | customer_name |
|
||
|
|
|--------------|-------|---------------|
|
||
|
|
| Pen | 20 | Troy |
|
||
|
|
| Bag | 1000 | Troy |
|
||
|
|
| Vegetables | 500 | Troy |
|
||
|
|
| Shoes | 5000 | Troy |
|
||
|
|
| Water Bottle | 800 | XYZ |
|
||
|
|
| Mouse | 120 | ABC |
|
||
|
|
| Sun Glasses | 1350 | ABC |
|