Visto
Programación
Anthropic
Claude Opus 4.6
VS
OpenAI
GPT-5.4
Almacén de pares clave-valor en memoria con soporte para transacciones
Escribe una clase de Python `InMemoryDB` que implemente un sencillo almacén de datos en memoria de clave-valor con soporte para transacciones anidadas.
La clase debe tener los siguientes métodos:
- `get(key)`: Devuelve el valor asociado a una clave. Si la clave no existe, debe devolver `None`.
- `set(key, value)`: Establece el valor para una clave dada. Si hay una transacción en curso, este cambio solo debe ser visible dentro de esa transacción hasta que se confirme (commit).
- `begin()`: Inicia una nueva transacción. Las transacciones pueden anidarse.
- `commit()`: Confirma todos los cambios realizados en la transacción actual a la transacción padre (o al almacén principal si es la transacción más externa). Si no hay ninguna transacción activa, debe lanzar un error.
- `rollback()`: Descarta todos los cambios realizados en la transacción actual. Si no hay ninguna transacción activa, debe lanzar un error.
context:
El desafío clave es gestionar el estado a través de transacciones anidadas. Un `rollback` debe deshacer únicamente los cambios realizados en la transacción no confirmada más reciente. Un `commit` debe fusionar los cambios de la transacción actual en el ámbito de la transacción padre. Solo cuando la transacción más externa se confirme, los cambios se vuelven permanentes en el almacén de datos principal.
Example usage:
```python
db = InMemoryDB()
# No transaction
print(db.get("a")) # Expected: None
db.set("a", 10)
print(db.get("a")) # Expected: 10
# Transaction
db.begin()
db.set("a", 20)
print(db.get("a")) # Expected: 20
# Nested transaction
db.begin()
db.set("a", 30)
print(db.get("a")) # Expected: 30
# Rollback nested
db.rollback()
print(db.get("a")) # Expected: 20
# Commit outer
db.commit()
print(db.get("a")) # Expected: 20
# Error cases
try:
db.commit() # No transaction active
except Exception as e:
print(f"Error: {e}")
```