если все эти транзакции пройдут, то только они будут зафиксированы. Если какая-либо из транзакций потерпит неудачу, она откатит все трансктоны - PullRequest
0 голосов
/ 05 октября 2018

Мне задали этот вопрос на собеседовании. Не могли бы вы дать мне знать ответ? Есть один сотрудник за столом ... С именем и адресом зарплаты. Он имеет право на подарочную карту на сумму 200 и на другую сумму подарочной карты.из 100рс .. также с него будет взиматься налоговая сумма в размере 50рс.

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Реализация транзакций в Hibernate или Spring может быть выполнена несколькими способами.Одним из наиболее простых в реализации было бы создание и закрытие транзакции самостоятельно.Как в примере ниже.

public void modifyEmployee(String employeeID) {
    Session session = factorySession.openSession();
    Transaction transaction = session.beginTransaction();
    try {
        Employee employee = session.get(Employee.class, employeeID);
        employee.setSalary(employee.getSalary()+200);
        session.update(employee);
        employee.setSalary(employee.getSalary()+100);
        session.update(employee);
        employee.setSalary(employee.getSalary()-50);
        session.update(employee);
    } catch(Exception e) {
        transaction.rollback();
    } finally {
        transaction.commit();
        session.close();
    }       
}

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

Существует гораздо лучший способ сделать это, но требует больше настроек.Я все еще рекомендовал бы это, поскольку это делает управление транзакциями намного проще и код намного чище, и это будет использовать Spring Transactional Manager.Это позволит Spring управлять вашими транзакциями, так что вам не придется беспокоиться о фиксации, открытии или даже закрытии сессии.Кроме того, с использованием аннотации:

@Transactional(rollbackFor = Exception.class) 

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

Надеюсь, это поможет.

0 голосов
/ 05 октября 2018

Сделайте это в НАЧАЛЕ - ИСКЛЮЧЕНИЕ - КОНЕЦ блока.Вы должны добавить код для обновления зарплаты.Если вы инкапсулируете его в процедуру, убедитесь, что внутри нет коммита.

BEGIN
  --add 200rs

  --add 100rs

  --substract 50rs

  COMMIT;

EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;

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