Как реализовать транзакции вручную без встроенного механизма
Python
Middle
Без компании
Как реализовать транзакции вручную без встроенного механизма
Ответы
Для реализации транзакций вручную можно использовать паттерн "Unit of Work". Основная идея - накапливать изменения и применять их атомарно. Пример с базой данных:
```
class ManualTransaction:
def __init__(self, connection):
self.connection = connection
self.operations = []
def add_operation(self, query, params=None):
self.operations.append((query, params or ()))
def commit(self):
cursor = self.connection.cursor()
try:
for query, params in self.operations:
cursor.execute(query, params)
self.connection.commit()
self.operations = []
except Exception as e:
self.connection.rollback()
raise e
def rollback(self):
self.operations = []
```
Использование:
```
conn = get_db_connection()
tx = ManualTransaction(conn)
try:
tx.add_operation("INSERT INTO users VALUES (?, ?)", (1, "Alice"))
tx.add_operation("UPDATE accounts SET balance = balance + 100 WHERE user_id = ?", (1,))
tx.commit()
except:
tx.rollback()
```
Ключевые моменты:
- Все операции собираются, но не выполняются до commit()
- При ошибке вызывается rollback()
- Подходит для простых случаев, но не заменяет полноценные транзакции СУБД