Sobes.tech
Junior — Middle
95

Hoe kun je conflicten voorkomen bij gelijktijdig gegevens schrijven in een database?

Bedrijven waar gevraagd werd
Лига Цифровой ЭкономикиЛига Цифровой Экономики

Antwoord van AI

sobes.tech AI

Чтобы предотвратить конфликты при одновременной записи данных в базу, используют несколько подходов:

  • Транзакции и блокировки: с помощью транзакций можно обеспечить атомарность операций. Различают блокировки на уровне строк, таблиц или базы, чтобы другие операции ждали завершения текущей.
  • Оптимистичная блокировка: при чтении данных сохраняется версия или временная метка, при записи проверяется, что данные не изменились с момента чтения. Если изменились — операция откатывается или повторяется.
  • Порядок доступа: проектирование приложения так, чтобы операции записи происходили последовательно или через очередь.

Пример оптимистичной блокировки на Python с использованием SQLAlchemy:

from sqlalchemy import Column, Integer, String, Version
from sqlalchemy.orm import sessionmaker

# модель с версионным полем
class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    version = Column(Integer, nullable=False, default=1)

Session = sessionmaker(bind=engine)
session = Session()

item = session.query(Item).filter_by(id=1).one()
item.name = 'new name'
item.version += 1  # обновляем версию

try:
    session.commit()
except:
    session.rollback()
    print("Конфликт при записи, попробуйте снова")

Таким образом, предотвращается потеря данных при одновременных изменениях.