Size: a a a

Django [ru] #STAY HOME

2021 February 27

А

Алексей in Django [ru] #STAY HOME
Swain
Тогда repeatable_read?
он даёт снимок на момент начала транзакции, т.е. вторая транзакция не увидит изменения первой, я во второй не увижу, что статус изменился, а мне наоборот надо это видеть
источник

S

Swain in Django [ru] #STAY HOME
Мне кажется ты что-то нереальное просишь.
источник

S

Swain in Django [ru] #STAY HOME
Типа, ты хочешь, быть в курсе изменений первой транзакции, но так, чтобы информация была получена уже после изменения первой транзакцией.
источник

S

Swain in Django [ru] #STAY HOME
И в то же время, тебе надо, чтобы такое отслеживаение происходило в течении всей транзакции.
источник

S

Swain in Django [ru] #STAY HOME
Может тебе тогда транзакцию раздробить нужно?
источник

А

Алексей in Django [ru] #STAY HOME
Swain
Мне кажется ты что-то нереальное просишь.
да почему?
1) первая транзакция меняет данные
2) в этот момент создаётся вторая, видит заблокированное и ждёт
3) после снятия блокировки она получает управление, берет свежий снимок того, что наделала первая
4) если изменения ее устраивают, выполняется дальше, если нет - откатывается
источник

S

Swain in Django [ru] #STAY HOME
Алексей
да почему?
1) первая транзакция меняет данные
2) в этот момент создаётся вторая, видит заблокированное и ждёт
3) после снятия блокировки она получает управление, берет свежий снимок того, что наделала первая
4) если изменения ее устраивают, выполняется дальше, если нет - откатывается
Так это repeatable_read.
источник

А

Алексей in Django [ru] #STAY HOME
Swain
Типа, ты хочешь, быть в курсе изменений первой транзакции, но так, чтобы информация была получена уже после изменения первой транзакцией.
так вторая же для этого и ждёт конца выполнения первой, когда ей самой разрешат
источник

А

Алексей in Django [ru] #STAY HOME
Swain
Так это repeatable_read.
нет! в нем хоть сколько селектов потом делай, он никогда не увидит свежего от 1й транзакции
источник

S

Swain in Django [ru] #STAY HOME
Алексей
нет! в нем хоть сколько селектов потом делай, он никогда не увидит свежего от 1й транзакции
Он увидит свежие изменения сразу после снятия блокировки камон.
источник

А

Алексей in Django [ru] #STAY HOME
Swain
Он увидит свежие изменения сразу после снятия блокировки камон.
короче, все ещё мутнее, хехе
Repeatable read вторую транзакцию не выполнит, т.к. первая поменяла данные
в таком случае ее перезапускать надо
источник

S

Swain in Django [ru] #STAY HOME
Алексей
короче, все ещё мутнее, хехе
Repeatable read вторую транзакцию не выполнит, т.к. первая поменяла данные
в таком случае ее перезапускать надо
Ну, тебе же это и нужно, нет?
источник

S

Swain in Django [ru] #STAY HOME
Алексей
свежий снимок получить чтобы, как раз режим по умолчанию даёт свежий снимок каждый раз при чтении
тут вопрос в том, что пока вторая транзакция ожидала, первая поменяла данные, и их надо перепрочитать
Ты же тут написал про перепрочтение.
источник

А

Алексей in Django [ru] #STAY HOME
Swain
Ну, тебе же это и нужно, нет?
получается, да, но я так понимаю, заново транзакцию я должен пересоздать
источник

А

Алексей in Django [ru] #STAY HOME
Команды UPDATE, DELETE, SELECT FOR UPDATE и SELECT FOR SHARE ведут себя подобно SELECT при поиске целевых строк: они найдут только те целевые строки, которые были зафиксированы на момент начала транзакции. Однако к моменту, когда они будут найдены, эти целевые строки могут быть уже изменены (а также удалены или заблокированы) другой параллельной транзакцией. В этом случае транзакция в режиме Repeatable Read будет ожидать фиксирования или отката первой изменяющей данные транзакции (если она ещё выполняется). Если первая изменяющая транзакция откатывается, её результат отбрасывается и текущая транзакция может продолжить изменение изначально полученной строки. Если же первая транзакция зафиксировалась и в результате изменила или удалила эту строку, а не просто заблокировала её, произойдёт откат текущей транзакции с сообщением

ОШИБКА: не удалось сериализовать доступ из-за параллельного изменения
так как транзакция уровня Repeatable Read не может изменять или блокировать строки, изменённые другими транзакциями с момента её начала.

Когда приложение получает это сообщение об ошибке, оно должна прервать текущую транзакцию и попытаться повторить её с самого начала. Во второй раз транзакция увидит внесённое до этого изменение как часть начального снимка базы данных, так что новая версия строки вполне может использоваться в качестве отправной точки для изменения в повторной транзакции.
источник

S

Swain in Django [ru] #STAY HOME
"Когда приложение получает это сообщение об ошибке, оно должна прервать текущую транзакцию и попытаться повторить её с самого начала. "

Ну вот, просто на стороне приложения сделай так, чтобы было несколько попыток.
источник

А

Алексей in Django [ru] #STAY HOME
Swain
"Когда приложение получает это сообщение об ошибке, оно должна прервать текущую транзакцию и попытаться повторить её с самого начала. "

Ну вот, просто на стороне приложения сделай так, чтобы было несколько попыток.
вот я механизм и спрашивал, ага, спасибо
приятно утром в субботу узнавать что-то новое
источник

S

Swain in Django [ru] #STAY HOME
Если принципиально важно, чтобы одна транзакция обязательно выполнилась после завершения первой можно через асинк попытаться сделать ожидание. Ну я так думаю.
источник

А

Алексей in Django [ru] #STAY HOME
по идее ещё с тем же успехом можно использовать nowait=True
ждать, когда освободится
источник

S

Swain in Django [ru] #STAY HOME
Алексей
по идее ещё с тем же успехом можно использовать nowait=True
ждать, когда освободится
Ну вот и отлично.
источник