Безопасен ли повторный переход после транзакции? - PullRequest
1 голос
/ 14 октября 2011

Может ли сбойная - при "коллизии транзакций" - операция записи в объект перезаписать изменения, внесенные в тот же объект в другой успешно совершенной транзакции?

Я понимаю, что транзакционные операции в gae находятся в снимке SERIALIZABLE изоляция , но не ясно, возможна ли запись перекоса .

Для простоты ради плохого примера выполнения счетчиков:

def increment_counter(key, amount):
    obj = db.get(key)
    obj.counter += amount
    obj.put()

Если запуск в транзакции потерпел неудачу из-за коллизии и был повторен, будет ли он обновляться правильно?

Означает ли повторная попытка повторную попытку всей операции или только фиксацию, или это означает, что коллизия была в группе сущностей, но внесенные здесь изменения не конфликтуют с другими изменениями в группе сущностей - потому что они где сделано для разных лиц.

PS. Это, возможно, глупый вопрос, но меня беспокоит, как именно эти повторы применяются.

UPDATE

В статье Транзакции есть подсказка, которую я пропустил.

Если сущность обновляется во время транзакции, то транзакция повторяется до тех пор, пока все шаги не будут выполнены без прерывания

Означает ли это, что весь код, выполняемый в контексте транзакции, перезапускается после коллизии?

1 Ответ

1 голос
/ 17 октября 2011

Да, вся функция перезапускается в случае столкновения.По этой причине вам нужно реализовывать транзакции в их собственных функциях: потому что их, возможно, придется выполнять несколько раз.Гарантируется, что ваши транзакционные изменения не будут перезаписывать другие транзакционные изменения - вот и весь смысл транзакционности.

...