Допустим, есть некоторая система с БД. В этой системе есть три сущности:
— пользователь (User),
— транзакция (Transaction),
— счет пользователя (Account).
Связаны они так, что пользователь и транзакция ссылаются на счет по внешнему ключу.
Работать с этим всем делом мы хотим через какой-нибудь ORM. В моем случае — это Django ORM.
Далее, пусть у нас есть некоторый счет, на котором изначально баланс равен 100. Также у нас есть транзакция (transaction) и пользователь (user), которые ссылаются на этот счет.
Теперь делаем следующее:
1. Обращаемся к полю user.account, чтобы объект счета вытянулся из БД в одну переменную:
print user.account
2. Обращаемся к полю transaction.account, чтобы объект счета вытянулся из БД в другую переменную:
print transaction.account
3. Обновляем счет у пользователя и сохраняем:
user.account.balance = 0<br/>
user.account.save()
4. Обновляем счет у транзакции (но уже по-другому) и тоже сохраняем:
transaction.account.balance += 100<br/>
transaction.account.save()
В итоге в БД хранится информация о том, что баланс равен 200, т.к. в пункте 4 ничего не известно о том, что произошло в пункте 3. И, хотя такой результат вполне логичен, он может быть весьма неожиданным.
Собственно, ситуация вполне реальная: пункты 1 и 2 могут находиться в разных частях системы и ничего друг о друге не знают.
В связи с чем есть пара вопросов:
1. Как избежать подобных ошибок, кроме как быть очень аккуратным?
2. Может быть, это проблема чисто Django ORM, как дела с Java Hibernate, например?
PS: нашел похожее обсуждение на stackoverflow:
stackoverflow.com/questions/680320/django-orm-cach...