Nyx con Ejemplos

Transacciones de base de datos

BEGIN TRANSACTION agrupa sentencias de forma atómica. COMMIT las hace durables; ROLLBACK las descarta. Esto es esencial para operaciones como transferencias de dinero donde actualizaciones parciales corromperían los datos.

Código

// nyx-db transactions — BEGIN, COMMIT, ROLLBACK

import "std/sqlite"

fn main() -> int {
    // Use embedded SQLite for the demo (recipe 55 shows basic usage).
    // The handle is an opaque pointer (*int); NULL on failure.
    let db = sqlite_open(":memory:")

    sqlite_exec(db, "CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance INTEGER)")
    sqlite_exec(db, "INSERT INTO accounts VALUES (1, 1000)")
    sqlite_exec(db, "INSERT INTO accounts VALUES (2, 500)")

    // Atomic money transfer using a transaction
    sqlite_exec(db, "BEGIN TRANSACTION")

    // Debit account 1
    sqlite_exec(db, "UPDATE accounts SET balance = balance - 100 WHERE id = 1")

    // Credit account 2
    sqlite_exec(db, "UPDATE accounts SET balance = balance + 100 WHERE id = 2")

    // Commit atomically
    sqlite_exec(db, "COMMIT")
    print("transfer committed")

    // Verify balances
    let rows: Array = sqlite_query(db, "SELECT id, balance FROM accounts ORDER BY id")
    var i: int = 0
    while i < rows.length() {
        let row: Array = rows[i]
        let id: String = row[0]
        let bal: String = row[1]
        print("  account " + id + ": " + bal)
        i = i + 1
    }

    // Rollback example
    sqlite_exec(db, "BEGIN TRANSACTION")
    sqlite_exec(db, "UPDATE accounts SET balance = 0 WHERE id = 1")
    sqlite_exec(db, "ROLLBACK")
    print("rolled back — balance unchanged")

    sqlite_close(db)
    return 0
}

Salida

transfer committed
  account 1: 900
  account 2: 600
rolled back — balance unchanged

Explicación

Sin transacciones, una caída entre el débito y el crédito dejaría $100 faltantes — el pecado capital del software financiero. BEGIN TRANSACTION abre un alcance atómico; todas las escrituras dentro quedan preparadas hasta que COMMIT las vuelca como una sola operación durable. Si algo sale mal, ROLLBACK descarta todos los cambios desde el BEGIN. Esto da la A (atomicidad) y la C (consistencia) de ACID sin esfuerzo adicional.

← Anterior Siguiente →

Source: examples/by-example/93-db-transactions.nx