Мне пришлось вставить объект в базу данных. Я использую транзакции Spring и спящий режим. Но перед тем, как вставить объект, мне нужно было проверить, существует ли он, если да, то я выбрасываю пользователю приятное исключение. Вот уловка, я не добавил уникальное ограничение на сущность для столбца, и из-за некоторого масштаба у меня есть дубликаты записей в моей базе данных.
У меня есть следующие вопросы
- Во-первых, почему транзакция Spring не нашла сущность, когда я искал ее перед вставкой.
- Как можно предотвратить ее, не принимая пессимистическую блокировку для вставки.
Я предполагаю, что Spring-транзакция берет старую копию базы данных перед началом транзакции и в то же время, если какая-либо транзакция записывает ту же сущность. У нас будут повторяющиеся записи.
Я использую метод checkAndInsert в моем слое dto, а следующий - мой сервисный слой
@Transactional(readOnly = true)
public Record getByName(String name){
return dao.getByName(name);
}
@Transactional
public void createRecord(Record record) {
dao.persist(record)
}
@Transactional
public void checkAndInsert(Record record){
if(getByName(record.getName()) != null){
createRecord(record);
}
}