Будет ли выполнен откат этих случаев транзакций? Последние 90% людей судили неправильно...

Java

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

В ходе обсуждения я попытался воспроизвести проблемную сцену, поднятую друзьями группы, и обнаружил еще одну ситуацию, которая может всех запутать.

В то время в группе упоминались результаты и причины, но рамки группы WeChat были ограничены, поэтому я написал статью отдельно и показал ее всем.

описание проблемы

Основной проект этой проблемы, который я использовал в предыдущем базовом загрузке Spring Boot 2.x«Доступ к MySQL с помощью Spring Data JPA»кейс.

Вы можете получить его через следующий репозиторийchapter3-4Каталог для получения базового проекта:

В этом проекте определите файл с именемUserОрганизация:

@Entity
@Data
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @Size(max = 5)
    private String name;
    @Max(50)
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

}

здесьnameДля длины установлено значение 5, так что имя в операторе вставки может быть слишком длинным, чтобы вызвать исключение, чтобы можно было проверить запуск транзакции.

Кроме того, проект также включает объект доступа к данным Spring Data Jpa.UserRepository, используемый для реализации операций с данными над сущностью User, и конкретный код здесь помещаться не будет.

Вот проблема

База данных здесь использует MySQL 5.7, механизм хранения — InnoDB, и используется уровень транзакций по умолчанию.

Давайте скорректируем эти четыре вопроса:

Вопрос 1: Будет ли выполнен откат test1?

@Transactional
public void test1() {
    userRepository.save(new User("AAA", 10));
    throw new RuntimeException();
}

Вопрос 2: Будет ли выполнен откат test2?

@Transactional
public void test2() {
    userRepository.save(new User("AAA", 10));
    try {
        throw new RuntimeException();
    } catch (Exception e) {
        log.error("异常捕获:", e);
    }
}

Вопрос 3: Будет ли выполнен откат test3? (Во втором предложении имя слишком длинное)

@Transactional
public void test3() {
    userRepository.save(new User("BBB", 10));
    userRepository.save(new User("123456", 20));
}

Вопрос 4: TEST4 откатится? (Во втором предложении имя слишком длинное)

@Transactional
public void test4() {
    userRepository.save(new User("BBB", 10));
    try {
        userRepository.save(new User("123456", 20));
    } catch (Exception e) {
        log.error("异常捕获:", e);
    }
}

Оставьте сообщение о своем ответе, эти четыре будут откатываться?

Совет test4 особенный! Сначала дайте время подумать, не уходите, не забудьте подписаться на меня, и ответ и причина будут объявлены в следующем посте! Если вы действительно голодны, то вы можете подписаться на официальный аккаунт: Programmer DD, ответить «Откат транзакции», и получить правильный ответ. Посмотрите, верно ли ваше суждение?

Если вы сомневаетесь в данных ответах, настоятельно рекомендуется скачать тематическое исследование статьи, затем написать несколько строк кода и попробовать эти сценарии! Если вы все еще не можете в это поверить, отладьте, чтобы узнать!

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

Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!