Следующий вопрос возник из вопроса об откате транзакций, поднятого другом группы в нашей группе технического обмена Spring несколько дней назад.
В ходе обсуждения я попытался воспроизвести проблемную сцену, поднятую друзьями группы, и обнаружил еще одну ситуацию, которая может всех запутать.
В то время в группе упоминались результаты и причины, но рамки группы WeChat были ограничены, поэтому я написал статью отдельно и показал ее всем.
описание проблемы
Основной проект этой проблемы, который я использовал в предыдущем базовом загрузке Spring Boot 2.x«Доступ к MySQL с помощью Spring Data JPA»кейс.
Вы можете получить его через следующий репозиторийchapter3-4
Каталог для получения базового проекта:
- Гитхаб:GitHub.com/first87112/sp…
- Гостиница:git ee.com/brother space/S…
В этом проекте определите файл с именем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. Название немного предвзятое, возможно, вы не пишете так каждый день, но я надеюсь, что этот неожиданный результат поможет вам следовать исходному коду, чтобы узнать!
Приглашаю обратить внимание на мой публичный номер: Программист ДД, поделитесь галантереей и мыслями, которых не видно снаружи!