Sobes.tech
Back to questions
Junior — Middle
65

Каким образом можно предотвратить возникновение конфликтов при одновременной записи данных в базу данных?

Companies where asked
Лига Цифровой ЭкономикиЛига Цифровой Экономики

Answer from 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("Конфликт при записи, попробуйте снова")

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