Welke benaderingen en methoden gebruik je om concurrentie te elimineren wanneer twee gebruikers gelijktijdig toegang hebben tot de database?
Antwoord van AI
sobes.tech AI
Для устранения конкуренции при одновременном доступе двух пользователей к базе данных применяются следующие подходы:
-
Транзакции и блокировки — использование транзакций с уровнем изоляции, который подходит под задачу (например, Serializable, Repeatable Read). Это позволяет избежать конфликтов при записи и чтении данных.
-
Оптимистичная блокировка — при обновлении данных проверяется, не изменились ли они с момента последнего чтения (например, через версионное поле). Если изменились — операция откатывается или повторяется.
-
Пессимистичная блокировка — явное блокирование строк или таблиц на время операции, чтобы другие пользователи не могли изменить данные.
-
Использование атомарных операций — например, в некоторых СУБД можно использовать команды, которые гарантируют атомарность обновления.
-
Очереди и сериализация запросов — если операции критичны, можно организовать очередь запросов на изменение данных.
Пример с использованием транзакций в Python с библиотекой psycopg2 для PostgreSQL:
import psycopg2
conn = psycopg2.connect(...)
try:
with conn:
with conn.cursor() as cur:
cur.execute("BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;")
cur.execute("SELECT balance FROM accounts WHERE id = %s FOR UPDATE;", (account_id,))
balance = cur.fetchone()[0]
new_balance = balance - amount
cur.execute("UPDATE accounts SET balance = %s WHERE id = %s;", (new_balance, account_id))
# транзакция автоматически коммитится
except Exception as e:
conn.rollback()
print("Ошибка при обновлении баланса:", e)