Files
databases.softwareshinobi.com/landing/docs/SQL-101/020-TCL-commands.md
Software Shinobi caa5bbb983
All checks were successful
learn org at code.softwareshinobi.com/databases.softwareshinobi.com/pipeline/head This commit looks good
rewriting
2025-06-19 13:04:08 -04:00

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 |