Что на самом деле делает откат? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь выяснить, что на самом деле выполняет откат.

У меня есть несколько сценариев:

  1. Откат после успешной фиксации.

    Connection conn=getConnection();
    try{
       executesSomeQuery(conn);
       conn.commit();
    } catch(Exception e){
       //assume no exception
    }finally{
       conn.rollback();
    }
    
  2. Откат после неудачной фиксации.Если совершить три запроса q1, q2, q3 по порядку в пределах одного и того же commit(), что произойдет с q1, если произойдет сбой q2?а как conn.rollback() помогает?Будет ли conn.commit() откат без необходимости rollback()?

    Connection conn=getConnection();
    try{
       executesSomeQuery(conn); // has three queries in order; q1, q2, q3. q2 fails and causes error
       conn.commit();
    } catch(Exception e){
       //assume exception is thrown because commit failed due to q2
       conn.rollback();
    }
    

Ответы [ 3 ]

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

Подтверждение и откат информируют базу данных, чтобы зафиксировать или откатить (т.е. отменить) текущую транзакцию.На уровне Java они вообще ничего не делают.

То, как это делается в базе данных, зависит от фактической реализации базы данных.

В вашем случае, если q2 завершится неудачей, какие-либо последствияq1 в базе данных будет отменен.

И, естественно, q3 вообще не будет выполняться.

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

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

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

Как следует из названия, rollback () откатывает транзакцию и не вносит никаких изменений в базу данных.

Все операторы в вашем блоке try выполняются последовательно в БД.Если какой-либо из них выдает исключение, код не фиксирует изменения, вместо этого он отменяет их все и оставляет БД в неизмененном состоянии.

Это помогает достичь атомарности для нескольких транзакций.

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