Spring Boot Jpa save 事务中小坑

1
2
3
4
5
6
7
8
在事务中处理两条数据互换唯一索引的问题。
MySQL 语句可以执行。
BEGIN;
update t_test as s set s.t1 = '121121212' where s.r_id = 1;
update t_test as s set s.t1 = '15921445301' where s.r_id = 2;
COMMIT;
在项目中频频出现,唯一索引冲突。
最后锁定到 jpa 的save 和 saveAndFlush的区别
1
2
3
4
5
6
7
8
9
10
11
save 是一种懒加载的方式,直到 flush或 commit发出命令才会保存到数据库
@Transactional
public <S extends T> S save(S entity) {

if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
saveAndFlush 会直接flush() 保存到数据库
/*
* (non-Javadoc)
* @see org.springframework.data.jpa.repository.JpaRepository#saveAndFlush(java.lang.Object)
*/
@Transactional
public <S extends T> S saveAndFlush(S entity) {

S result = save(entity);
flush();

return result;
}

276429067163203395.jpg