Сколько коммитов откатывается, когда мы вызываем откат? - PullRequest
0 голосов
/ 29 января 2019

Каково поведение отката, когда у нас есть 2 или более коммитов?

Connection conn= getConnection();

try{

doSomeInsertOrUpdateStep1(conn); //some sql update/insert using connection
conn.commit(); //step 1

doSomeInsertOrUpdateStep2(conn); //some sql update/insert using connection
conn.commit(); //step 2

//ERROR IS THROWN HERE AFTER SECOND COMMIT
} catch(Exception e){

   conn.rollback(); //what will be rolledback exactly step 1 or step2 or both?

}

Если после второго коммита возникнет ошибка, я не знаю, что ожидается откат вэтот сценарий.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Из документации Oracle :

Используйте оператор COMMIT, чтобы завершить текущую транзакцию и сделать постоянными все изменения, выполненные в транзакции.

[...]

Пока вы не совершите транзакцию: [...] Вы можете откатить (отменить) любые изменения, сделанные во время транзакции, с помощью инструкции ROLLBACK.

Таким образом, в основном вашкод работает следующим образом:

  • выполнить первый запрос: если он выполнен успешно, то COMMIT и продолжить;иначе ROLLBACK (отменить все незавершенные изменения, сделанные до того, как был выполнен первый оператор) и остановить (не запускать следующий оператор)
  • выполнить второй оператор: если это удастся, то COMMIT, иначе ROLLBACK.Обратите внимание, что, поскольку COMMIT был выполнен непосредственно перед выполнением оператора, ROLLBACK все равно не будет иметь ничего общего.

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

Чтобы реализовать это поведение, вам нужно будет удалить первый COMMIT (после того, как первый запрос был успешно выполнен).

0 голосов
/ 29 января 2019

Зависит от того, когда возникает исключение.

Например, если исключение выдается после первого принятия и до второго принятия, откат отменяет любые обновления БД, выполненные doSomeInsertOrUpdateStep2(conn);.

Если, с другой стороны, перед первым коммитом выдается исключение, откат блока catch отменит все обновления БД, выполненные doSomeInsertOrUpdateStep1(conn); (и в этом случае doSomeInsertOrUpdateStep2(conn); не будет выполняться привсе).

Любые обновления, которые уже были зафиксированы, не будут отменены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...