[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-optimistichnaya-i-pessimistichnaya-blokirovki":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1037,"optimistichnaya-i-pessimistichnaya-blokirovki",19,"hibernate","Hibernate","🐻","Оптимистичная и пессимистичная блокировки","Блокировки решают проблему потерянных обновлений (lost updates), когда два потока одновременно читают и обновляют одну и ту же запись.\n\n### Оптимистичная блокировка (@Version)\n\nПредполагает, что конфликты редки. Проверяет версию записи при обновлении. Если версия изменилась — бросает исключение.\n\n```java\n@Entity\npublic class Product {\n    @Id\n    private Long id;\n    private String name;\n    private BigDecimal price;\n\n    @Version  \u002F\u002F Hibernate автоматически управляет этим полем\n    private Long version;\n}\n```\n\nСгенерированный SQL:\n\n```sql\n-- При UPDATE Hibernate проверяет version:\nUPDATE products SET name = ?, price = ?, version = 2\nWHERE id = 1 AND version = 1;\n-- Если version изменилась → 0 строк обновлено → OptimisticLockException\n```\n\n### Пессимистичная блокировка (LockModeType)\n\nБлокирует строку в БД (SELECT ... FOR UPDATE), предотвращая конкурентный доступ.\n\n```java\n\u002F\u002F JPA\nProduct product = entityManager.find(Product.class, id,\n    LockModeType.PESSIMISTIC_WRITE);\n\u002F\u002F SQL: SELECT * FROM products WHERE id = 1 FOR UPDATE\n\n\u002F\u002F Spring Data JPA\n@Lock(LockModeType.PESSIMISTIC_WRITE)\n@Query(\"SELECT p FROM Product p WHERE p.id = :id\")\nOptional\u003CProduct> findByIdForUpdate(@Param(\"id\") Long id);\n```\n\n### Типы LockModeType\n\n| Тип | SQL | Назначение |\n|-----|-----|------------|\n| PESSIMISTIC_READ | FOR SHARE | Разрешает concurrent reads, блокирует writes |\n| PESSIMISTIC_WRITE | FOR UPDATE | Блокирует и reads, и writes |\n| PESSIMISTIC_FORCE_INCREMENT | FOR UPDATE + version++ | Для update с инкрементом версии |\n\n### Сравнение\n\n| Критерий | Оптимистичная | Пессимистичная |\n|----------|--------------|----------------|\n| Механизм | Проверка версии при UPDATE | Блокировка строки в БД |\n| Конфликт | Обнаружение (exception) | Предотвращение (ожидание) |\n| Производительность | Выше при редких конфликтах | Выше при частых конфликтах |\n| Deadlock | Нет | Возможен |\n\n### Важное\n\n- Оптимистичная — `@Version`, проверка при UPDATE, исключение при конфликте; подходит для большинства сценариев\n- Пессимистичная — FOR UPDATE, блокировка строки; для критичных операций (списание средств, резервирование)\n- `@Version` может быть Long, Integer, Timestamp (Long предпочтительнее)\n- Оптимистичная блокировка работает и между HTTP-запросами (stateless)\n\n### Частые ошибки\n\n- Не использовать блокировки вообще — lost updates в конкурентном приложении неизбежны\n- Пессимистичная блокировка без таймаута — бесконечное ожидание при deadlock; задайте `javax.persistence.lock.timeout`\n- `@Version` на поле, которое обновляется вручную — Hibernate должен управлять version автоматически\n- Оптимистичная блокировка для частых конфликтов — постоянные OptimisticLockException ухудшают UX; используйте пессимистичную\n\n### Как используется в 2026\n\n- Оптимистичная блокировка (`@Version`) — стандарт по умолчанию для большинства сущностей\n- Пессимистичная — для финансовых операций, инвентаря, резервирования\n- Для распределённых систем — distributed locks (Redis, Zookeeper) вместо БД-блокировок\n\n> **На собеседовании:** начните с проблемы lost updates, затем покажите два решения. Оптимистичная — `@Version`, подходит в 90% случаев. Пессимистичная — FOR UPDATE, для финансов и критичных операций. Интервьюер может спросить про deadlock при пессимистичной блокировке — упомяните таймаут.","","middle",[15,16,17,7,18],"performance","locking","jpa","concurrency",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":34,"featuredSnippetReady":35},"Оптимистичная и пессимистичная блокировки в Hibernate — Gymterview","Оптимистичная блокировка через @Version (проверка при UPDATE), пессимистичная через FOR UPDATE. Сравнение, LockModeType, обработка конфликтов.","Оптимистичная vs пессимистичная блокировка в JPA\u002FHibernate — Gymterview","@Version для оптимистичной, FOR UPDATE для пессимистичной. Сравнение: когда какую использовать, deadlock, таймаут.",[27,28,29,30,31,32,8,33],"оптимистичная блокировка","пессимистичная блокировка","@Version","OptimisticLockException","FOR UPDATE","LockModeType","JPA","Оптимистичная блокировка (@Version): проверяет версию при UPDATE, бросает OptimisticLockException при конфликте. Подходит для 90% случаев. Пессимистичная (LockModeType.PESSIMISTIC_WRITE → FOR UPDATE): блокирует строку в БД, предотвращая конкурентный доступ. Для финансовых операций. Оптимистичная — при редких конфликтах, пессимистичная — при частых. Deadlock возможен только при пессимистичной.",true]