Аннотация @Transactional — мощный инструмент, но ее неправильное использование может привести к незаметным, но критическим ошибкам: потерянные данные, неожиданные откаты или вовсе отсутствие транзакции. Разбираем частые ошибки и их решения.
Если вызываете транзакционный метод внутри того же класса (this.method()), Spring-прокси не срабатывает, и транзакция не создается.
@Service
public class OrderService {
@Transactional
public void createOrder() {
saveOrder(); // Вызов внутреннего метода - транзакция НЕ создается!
}
private void saveOrder() {
// Сохранение заказа
}
}
— Решение: вынести метод в другой Spring-бин.
Spring AOP работает через прокси, а прокси не видит private-методы. В результате @Transactional в таких методах просто игнорируется.
@Transactional
private void saveData() { // Транзакция НЕ будет работать!
repository.save(entity);
}
— Решение: метод должен быть public и вызываться через другой Spring-бин
Уровень распространения (propagation) определяет, как транзакция будет вести себя относительно уже существующих транзакций. Выбор значения по умолчанию (REQUIRED) подходит в большинстве случаев, но в сложных сценариях важно понимать, как работают другие варианты:
— REQUIRED использует текущую транзакцию, если она есть, иначе создаёт новую.
— REQUIRES_NEW всегда создаёт новую транзакцию, независимо от текущей (может привести к неожиданным коммитам).
— NESTED создаёт вложенную транзакцию, которая откатывается отдельно от родительской.
— SUPPORTS использует существующую транзакцию, но не требует её (если транзакции нет, работает без неё).
— NOT_SUPPORTED выполняет код вне транзакции, даже если она уже существует.
— NEVER гарантирует, что код выполняется только вне транзакции, иначе выбрасывает исключение.
— MANDATORY требует, чтобы код выполнялся внутри уже существующей транзакции, иначе выбрасывает исключение.
Spring по умолчанию откатывает транзакции только при RuntimeException, а CheckedException (например, SQLException) его не прерывает. Однако изменение этого поведения требует осторожности.
@Transactional
public void updateUser() throws IOException { // CheckedException не откатит транзакцию!
userRepository.save(user);
throw new IOException("Ошибка ввода-вывода");
}
— Решение: указать rollbackFor = Exception.class, если хотите откатывать и CheckedException.
Spring сначала коммитит транзакцию, а потом отправляет HTTP-ответ. Если после коммита возникнет ошибка (например, сеть упала), клиент может получить 500, но изменения уже сохранены.
— Решение: транзакции должны быть в сервисах, а не в контроллерах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥12❤1❤🔥1😁1
Forwarded from Библиотека питониста | Python, Django, Flask
📝 Структуры данных: ТОП-30 вопросов и ответов для собеседований в 2025 году
Техническое собеседование на позицию разработчика, дата-сайентиста и ML-инженера часто включает вопросы по структурам данных и связанным с ними алгоритмами.
В нашей статье мы рассмотрим базовые и продвинутые темы, разберем типичные задачи и обсудим оптимальные способы их решения.
📄 Прочитайте статью и укрепите свои знания — https://proglib.io/sh/1uYAygzIxr
Библиотека питониста
Техническое собеседование на позицию разработчика, дата-сайентиста и ML-инженера часто включает вопросы по структурам данных и связанным с ними алгоритмами.
В нашей статье мы рассмотрим базовые и продвинутые темы, разберем типичные задачи и обсудим оптимальные способы их решения.
📄 Прочитайте статью и укрепите свои знания — https://proglib.io/sh/1uYAygzIxr
Библиотека питониста
👍7🔥3❤1👏1
Все знают
Ctrl + Alt + L
(форматирование кода), но мало кто знает это сочетание:—
Ctrl + Alt + Shift + L
→ Гибкое форматирование🔹 Зачем это нужно
— Позволяет выбрать, что именно форматировать: весь файл, выделенный код или даже только измененные строки.
— Можно отключить автоформатирование аннотаций, импортов или пробелов, если не хотите, чтобы IDEA ломала ваш стиль.
— Полезно, если работаете в команде с жесткими code style правилами, можно форматировать только нужные части, не трогая остальной код.
🔹 Дополнительные трюки
— Выделите код, затем
Ctrl + Alt + Shift + L
, чтобы форматировать только его.— Используйте Settings → Editor → Code Style, чтобы настроить форматирование под себя.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥6❤🔥2😁2⚡1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁35👍7💯5❤2
Держите под рукой этот чек-лист, чтобы избежать проблем с многопоточностью и повысить производительность кода:
🔹 Синхронизация
✓ Избегайте synchronized для долгих операций
✓ Используйте ReentrantLock для гибкой блокировки
✓ Следите за возможностью deadlock
🔹 Исполнители (Executors)
✓ FixedThreadPool подходит, когда количество потоков заранее известно и ограничено
✓ CachedThreadPool динамически создает потоки, но может привести к их неконтролируемому росту
✓ ForkJoinPool для задач, разбиваемых на подзадачи
🔹 Коллекции и очереди
✓ ConcurrentHashMap потокобезопасная альтернатива HashMap, но не подходит для сценариев с частыми изменениями
✓ BlockingQueue для потокобезопасных очередей
✓ CopyOnWriteArrayList хорош при редких изменениях списка, но ⚠️ медленный при частых модификациях (из-за копирования)
🔹 Работа с Future & CompletableFuture
✓ Используйте CompletableFuture для асинхронных операций вместо Future
✓ thenApply() и thenCompose() позволяют строить цепочки вызовов без блокировки
✓ exceptionally() для обработка ошибок без использования try-catch в коде
Автоматизируйте проверку кода с помощью FindBugs, SonarQube и Checkstyle.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3❤1
Наш подписчик задал вопрос:
Я работаю Java-разработчиком 2 года. Сейчас в основном пишу CRUD-сервисы и исправляю баги. Но чувствую, что топчусь на месте. Какие навыки стоит развивать, чтобы через год-два вырасти до мидла или даже сеньора? Углубляться в Spring или изучать что-то новое там, многопоточность или архитектуру?
🔹Друзья, что посоветуете?
Автор самого полезного и детального ответа получит
— Какие технические навыки нужны для роста?
— Изучать ли что-то кроме Spring?
— Какие soft skills действительно ценят компании?
— Ваши истории роста в IT.
P.S. Если хотите задать вопрос, заполните нашу гугл-форму. Это займет 5 минут.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3😁2🥱1
Хотите узнать, какие фичи принесёт релиз Java 24 и как они повлияют на вашу разработку? Тогда это видео — must-watch 🎥
Никола Поллок, разработчик Java в Oracle, рассказывает о самых свежих изменениях в экосистеме Java:
— AOT-компиляция
— Виртуальные потоки
— Новые API для работы с байт-кодом и потоками
— GGC и ZGC
Лекция поможет быть в курсе последних трендов и нововведений Java, которые помогут оптимизировать код, улучшить производительность и использовать новые инструменты на полную.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4❤2👏2
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов
В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.
➡️ Читать статью
➡️ Зеркало
В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.
➡️ Читать статью
➡️ Зеркало
👍11🔥3😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19👍9🔥2
— Убирает тонны шаблонного кода (геттеры, сеттеры, toString(), equals(), hashCode()).
— Делает код компактнее и читабельнее.
— Ускоряет разработку, снижает когнитивную нагрузку.
— Скрывает важную логику, что усложняет отладку и поддержку.
— Добавляет магию и делает код зависимым от нестандартных аннотаций.
— Может вызывать проблемы с сериализацией и совместимостью при обновлениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥8👏2😢1
🔹 JEP-ы в фокусе:
— JEP 450: компактные заголовки объектов
JEP направлен на уменьшение размера заголовков объектов с 96–128 до 64 бит на 64-битных платформах, перешел в статус Proposed to Target. Это изменение обещает снизить объем используемой кучи и повысить эффективность работы приложений.
— JEP 484: API для файлов классов
В JDK 24 планируется внедрение JEP 484, который предоставит стандартный API для обработки файлов классов.
🔹 Релизы:
— Выпуск IntelliJ IDEA 2024.3 EAP 5: gоддержка функций Kotlin 2.1, улучшенная подсветка выделенных слов во всем файле, новые иконки и другое.
— Kora 1.1.20: улучшения и исправления способов настройки компонентов gRPC, ошибок обработки Cassandra UDT типа для списков, работа дискриминаторов моделей в OpenAPI-генераторе
— Native Build Tools 0.10.5: поддержка единого reachability-metadata.json, исправление ошибки Gradle-плагина.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2❤1👾1
🔹 @Transactional — оборачивает метод в транзакцию
@Transactional
public void saveData(Entity entity) {
repository.save(entity);
}
Автооткат при исключениях, но не ловит checked-исключения без rollbackFor = Exception.class.
🔹 @Async — делает метод асинхронным
@Async
public CompletableFuture<String> fetchData() {
return CompletableFuture.completedFuture("Hello");
}
Использует TaskExecutor, но не забываем про конфиг @EnableAsync.
🔹 @RestControllerAdvice — глобальный хендлер ошибок
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<String> handleException(RuntimeException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
}
}
Вместо тонны try-catch обрабатываем ошибки централизованно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3❤2🤔2
Forwarded from Библиотека задач по Java | тесты, код, задания
Как Spring обрабатывает исключения в @Transactional методе?
Anonymous Quiz
45%
Любое исключение приводит к откату транзакции
7%
Транзакция не откатывается автоматически, если не вызвать TransactionStatus.setRollbackOnly()
40%
Транзакция откатывается только при возникновении RuntimeException или Error
4%
Spring создаёт новую транзакцию при каждом исключении, чтобы попытаться выполнить операцию повторно.
4%
Если метод @Transactional выбрасывает исключение, Spring закрывает весь контекст приложения.
👍9🔥5😁5❤🔥2
❗️Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
🔥1👏1😁1
Media is too big
VIEW IN TELEGRAM
Proglib рассказывает базу в формате рилса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥱5💯3
🧩💊 Алгоритмическая самоуспокоенность: как мы разучились думать своей головой
Каждый день мы сталкиваемся с бесконечным потоком информации, которая не просто наполняет наш день, а управляет нашими мыслями. Социальные сети, алгоритмы и вечная гонка за вниманием приводят к тому, что мы забываем, как думать собственной головой.
Это не просто влияет на настроение, но и на способность анализировать информацию, принимать решения и, главное, не становиться частью системы манипуляций.
Если вы хотите вернуться к осознанному подходу в восприятии мира и научиться фильтровать контент, то эта тема точно для вас.
🔗 Подробнее в статье
🐸 Библиотека джависта
Каждый день мы сталкиваемся с бесконечным потоком информации, которая не просто наполняет наш день, а управляет нашими мыслями. Социальные сети, алгоритмы и вечная гонка за вниманием приводят к тому, что мы забываем, как думать собственной головой.
Это не просто влияет на настроение, но и на способность анализировать информацию, принимать решения и, главное, не становиться частью системы манипуляций.
Если вы хотите вернуться к осознанному подходу в восприятии мира и научиться фильтровать контент, то эта тема точно для вас.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3❤1
Часто приходится конвертировать Entity -> DTO или DTO -> Model. Вот основные способы, как это сделать.
Простой, но не очень масштабируемый.
public class UserMapper {
public static UserDto toDto(User user) {
return new UserDto(user.getId(), user.getName());
}
public static User toEntity(UserDto dto) {
return new User(dto.getId(), dto.getName());
}
}
Генерирует код на этапе компиляции → быстрее, чем рефлексия.
@Mapper
public interface UserMapper {
UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
UserDto toDto(User user);
User toEntity(UserDto dto);
}
Просто, но медленнее из-за рефлексии.
ModelMapper modelMapper = new ModelMapper();
UserDto dto = modelMapper.map(user, UserDto.class);
Используем record вместо классов DTO для упрощения кода.
record UserDto(Long id, String name) {}
UserDto dto = new UserDto(user.getId(), user.getName());
Если нужно преобразовать список объектов.
List<UserDto> dtos = users.stream()
.map(UserMapper::toDto)
.collect(Collectors.toList());
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥9❤4😁4❤🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁48🔥9👍8😢2❤1
Обнаружили в профилировщике тормозящий код? Попробуйте этот промпт, чтобы AI помог вам оптимизировать его:
📝 Промпт:
Analyze the following Java code and suggest optimizations for better performance. Identify bottlenecks, improve memory usage, and recommend alternative approaches.
// Вставьте ваш код здесь
— Добавьте
Refactor it using Streams and functional programming
, если хотите более элегантный код.— Добавьте
Optimize it for multi-threading and concurrency
, если ваш код нагружен задачами.— Добавьте
Suggest a profiling strategy to measure performance issues
, если нужна диагностика.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3🎉1