我必须在数据库中插入一个实体。我正在使用Spring事务并休眠。但是在插入实体之前,我需要检查它是否已经存在,所以我向用户抛出了一个很好的异常。这是一个问题,我没有在列的实体上添加唯一约束,并且由于某种规模,我的数据库中存在重复的条目。
我有以下问题
- 首先,当我在插入之前搜索实体时,Spring事务为何找不到该实体。
- 在不使用悲观锁进行插入的情况下,防止它的可能方法是什么。
我的猜测是,Spring事务在启动事务之前会同时获取数据库的旧副本,如果有任何事务写入同一实体,则它会同时进行。我们将有重复的条目。
我在dto层中使用checkAndInsert方法,以下是我的服务层
@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);
}
}