У меня есть таблица Items and Jobs:
Предметы
- id = PK
- job_id = Работы FK
- статус = IN_PROGRESS | ПОЛНОЕ
работы
- id = PK
Элементы начинаются как IN_PROGRESS, но работа выполняется над ними и передается работнику для обновления. У меня есть процесс обновления, который обновляет элементы по мере их поступления, с новым статусом. Подход, который я делал до сих пор, был (в псевдокоде):
def work(item: Item) = {
insideTransaction {
updateItemWithNewStatus(item)
jobs, items = getParentJobAndAllItems(item)
newJobStatus = computeParentJobStatus(jobs, items)
// do some stuff depending on newJobStatus
}
}
Имеет ли это смысл? Я хочу, чтобы это работало в параллельной среде. Проблема, которую я сейчас имею в виду, заключается в том, что COMPLETE многократно приходит на работу, когда я только хочу сделать логику на COMPLETE, один раз.
Если я изменил уровень транзакции на SERIALIZABLE, я получаю сообщение об ошибке "ERROR: не удалось выполнить сериализацию доступа из-за ошибок чтения/записи между транзакциями", как описано.
Поэтому мои вопросы:
- Нужен ли мне SERIALIZABLE?
- Могу ли я уйти с SELECT FOR UPDATE и где?
- Может кто-нибудь объяснить мне, что происходит, и почему?
Edit: Я снова открыл этот вопрос, потому что меня не устраивало объяснение предыдущих ответов. Кто-нибудь может объяснить это мне? В частности, мне нужны некоторые примерные запросы для этого псевдокода.