Junior — Middle
105
Чӣ гуна метавон пешгирӣ кард, ки дар вақти навиштани ҳамзамон маълумот ба базаи додаҳо муноқишаҳо пайдо нашаванд?
Ширкатҳо дар куҷо пурсиданд
Ҷавоб аз 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("Конфликт при записи, попробуйте снова")
Таким образом, предотвращается потеря данных при одновременных изменениях.