Если в методе, где объявлено кэширование, возникает исключение, кешировать нечего, все в порядке.
Нет простого способа привязать кеш Spring к транзакции, и я думаю, чтоэто было бы неправильно.
Попробуйте использовать что-то вроде Hibernate 2-го уровня Cache (например, с Ehcache) или аналогичный DB Cache.Они автоматически удаляют или добавляют данные в зависимости от состояния БД.Они обеспечивают согласованность с БД.