Который должен взять на себя инициативу по откату, приложению или базе данных? - PullRequest
2 голосов
/ 23 июля 2010

MySql InnoDB отключен для автоматической фиксации и используется уровень изоляции по умолчанию REPEATABLE READ.Существует два сценария, в которых две различные транзакции T1 и T2 выполняются в указанной ниже временной последовательности:

1)

time    T1                  T2

t1  update row 1->OK
t2                      update row 2->OK
t3  update row 2->wait->timeout error
t4  commit or rollback or retry t3

T1 получает ошибку тайм-аута в момент времени t3, поскольку он не может захватить блокировку записив строке 2 этот T2 еще не освобождается, тем не менее, если T1 фиксируется в момент времени t4, это приводит к «частичному» обновлению для T1, то есть строка 1 обновляется, а строка 2 нет, таким образом, правило «атомарности» ACID нарушается этимпрактика.

В соответствии с правилом "атомарности" ACID транзакция должна либо "завершиться" успешно, либо завершиться неудачно, но не частично.

APP должна либо запросить T1 для отката, либо повторить попытку обновления по таймеру.до достижения успеха перед фиксацией в t4 при получении ошибки в t3, таким образом, достигните правила атомарности.

2)

time    T1              T2

t1  update row 1->OK
t2                  update row 2->OK
t3  update row 2->wait
t4                  update row 1-> DB detects deadlock then forces T2 rolled back
      wait->OK

В 1) DB доставляет только ошибку тайм-аута в APP, и только до APP решает откат T1 или нет, но в 2) не только DB обнаруживаетошибка взаимоблокировки, но также действует для отката потенциального тупика T2.

Теоретически, в 1) DB также может выполнять откат T1, но в 2) DB может только отменить операцию, которая может вызвать взаимоблокировку, тогдадоставить ошибку взаимоблокировки в APP, и именно APP решает откат T2 или нет.

Вопрос заключается в том, какие конкретные условия соответствуют для DB, чтобы выбрать, будет ли приложение или само по себе обрабатывать откаты, когдаошибки выявляются в первую очередь на уровне БД.

Большое спасибо!

1 Ответ

2 голосов
/ 23 июля 2010

Откат всегда должен обрабатываться клиентским приложением, не БД. Клиент может выполнять множество различных операций как одну «единицу работы», поэтому клиент должен иметь контроль над тем, когда эта работа добавляется в базу данных или откатывается.

Ссылки
Вы можете сослаться на эту полезную ссылку от Тома Кайта, который так сильно относится к этой проблеме, что он даже предлагает удалить commit / rollback из PL / SQL (процедурный язык Oracle; я знаю, что ваша БД - mysql, но концепция остается прежней).

еще одна веская причина ЗАЯВЛЕНИЕ КЛИЕНТА, единственное который действительно может контролировать транзакцию поток, должен либо

а) зафиксировать или б) откат

его работа. (вместе с триггерами, автономные транзакции и когда другие, я бы покончил с коммитом и откат в plsql, если у меня был свой путь :)

...