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, чтобы выбрать, будет ли приложение или само по себе обрабатывать откаты, когдаошибки выявляются в первую очередь на уровне БД.
Большое спасибо!