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.