Безопасен ли с точки зрения многопоточного доступа 2L кэш в JPA/Hibernate?
Кэш второго уровня работает, условно говоря, на уровне EntityManagerFactory/SessionFactory, которые функционируют уже не исключительно в рамках одного потока и могут "разделяться" меж разными потоками внутри приложения.
У нас есть 4 стратегии кэширования(read-only, ...). Они регулируют правила обновления кэша при апдейтах сущностей в нем и доступ к этим самым сущностям.
Например, при read-write если транзакция-1 обновила сущность в кэше, то эта сущность в кэше так же "блокируется" вплоть до завершения транзакции-1. И если до завершения транзакции-1 за этой самой сущностью в кэш придет транзакция-2, то она будет перенаправлена в БД.
То есть кэш 2L вроде как по определению должен уметь работать в многопоточной среде и спокойно управлять доступом потоков из разных транзакций к сущностям внутри себя. Но поиск по гуглу почему-то дальше объяснения принципов работы стратегий кэширования ничего по теме не выдает.
Вопрос - как регулируется многопоточный доступ к кэшу второго уровня? Обеспечит ли механизм JPA/Hibernate "потоко-безопасный" доступ к кэшу второго уровня? Нам, как разработчикам, не следует применять никаких дополнительных средств, помимо определения стратегии кэширования, для обеспечения функционирования 2L кэша в многопоточной среде? Есть ли, возможно, какие-либо распространенные подводные камни на этот счет?
Вот в этой вот статье упоминаются "проблемы" кэширования, но как-то вскользь, без конкретики. Собственно поэтому меня вопрос и заинтересовал.
Если где-то выше ошибся в своем изложении работы механизма кэша 2L, укажите пожалуйста.
Спасибо!