# ACID

ACID properties (Atomicity, Consistency, Isolation, Durability) are crucial for reliable database transactions. Here's how Microsoft SQL Server (MSSQL) ensures ACID compliance, illustrated with examples:

**1. Atomicity:** A transaction is treated as a single, indivisible unit of work. Either all changes within the transaction are committed, or none are. If any part fails, the entire transaction is rolled back.

* **Example:** Imagine transferring $100 from account A to account B. This involves two operations: debiting account A and crediting account B. Atomicity ensures that if the debit from A succeeds but the credit to B fails (due to a system error, for instance), the initial debit is undone, maintaining data integrity. MSSQL uses transaction logs to achieve this.

```sql
-- Begin transaction
BEGIN TRANSACTION;

-- Debit account A
UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 'A';

-- Credit account B (Simulate a failure for demonstration)
-- UPDATE Accounts SET Balance = Balance + 100 WHERE AccountID = 'B'; --Uncomment to test success
-- RAISERROR('Simulated error', 16, 1); --Simulate an error

-- Commit transaction (only if no errors)
IF @@ERROR = 0
    COMMIT TRANSACTION;
ELSE
    ROLLBACK TRANSACTION;
```

**2. Consistency:** A transaction must maintain the database's integrity constraints. It starts in a valid state, performs operations, and ends in another valid state.

* **Example:** Suppose a rule exists that account balances cannot be negative. A transaction that attempts to withdraw more money than available would violate consistency. MSSQL's constraints (CHECK constraints, foreign key constraints, etc.) enforce this. If the `UPDATE` statement in the example above tries to debit more than the available balance, it will fail and the transaction will be rolled back, preserving consistency.

```sql
--Example of a check constraint in MSSQL to prevent negative balances
ALTER TABLE Accounts
ADD CONSTRAINT CK_PositiveBalance CHECK (Balance >= 0);
```

**3. Isolation:** Concurrent transactions appear to execute one at a time, preventing interference and ensuring that each transaction sees a consistent view of the data. Different isolation levels (Read Uncommitted, Read Committed, Repeatable Read, Serializable) in MSSQL control the level of isolation.

* **Example:** Two users might try to update the same record simultaneously. Without isolation, one user's changes might overwrite the other's, leading to data corruption. MSSQL's isolation levels prevent this by using locking mechanisms (shared locks, exclusive locks). Higher isolation levels offer stronger protection but may reduce concurrency.

**4. Durability:** Once a transaction is committed, the changes are permanent and survive even system failures (power outages, crashes).

* **Example:** After a successful transaction, MSSQL writes the changes to its transaction log and then to disk. Even if the server crashes immediately after the commit, the changes are recovered when the server restarts. The transaction log acts as a backup to ensure durability.

**In summary:** MSSQL uses various mechanisms like transaction logs, locking, constraints, and different isolation levels to guarantee ACID compliance, ensuring data integrity and reliability in database transactions. The choice of isolation level involves a trade-off between concurrency and data consistency. Higher isolation levels provide greater consistency but can reduce concurrency.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sannlynnhtun.gitbook.io/dotnet-developer/sql-basic/acid.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
