welcome to xlongwei.com

欢迎大家一起学习、交流、分享


QQ:9167702333 邮箱:admin@xlongwei.com

JPA transaction 事务处理


分类 Java   关键字 分享   标签 java   spring   发布 hongwei  1438846605659
注意 转载须保留原文链接,译文链接,作者译者等信息。  

JPA提供了Repository接口和命名接口方法名都非常方便表实体的增删改查处理,事务处理在数据库一致性方面是非常重要的,同时又令人感觉到有点不确定性:事务有效果吗?



JpaRepository有实现类SimpleJpaRepository,它给create、update、delete方法都默认加上了事务的支持,而本文侧重多个Repository存储多条数据时的事务处理。JpaSpecificationExecutor提供了复杂查询能力,Specification封装了复杂查询条件。
//SimpleJpaRepository 365行
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}

事务测试代码
@Transactional
public void save(User user, UserProfile userProfile, UserEnterpriseProfile userEnterpriseProfile) {
user = userRepository.save(user);
userProfile = userProfileRepository.save(userProfile);
userEnterpriseProfile = userEnterpriseProfileRepository.save(userEnterpriseProfile);
System.out.println(user.toString()+","+userProfile.toString()+","+userEnterpriseProfile.toString());
}
代码分析:
如果save方法没有事务,则函数内三次save都是独立的事务,无法保证这三条记录要么都保存成功,或者都不保存。失败的save只触发当前事务的回滚,而之前成功执行的save不会受影响。
而整个方法加上事务后,失败的save会触发整个事务的回滚,在整个事务提交之前数据是不会进数据库的,只有在事务提交时,存入数据库异常则整体回滚,三条记录都不保存。

dubbo远程调用不支持事务处理(无法原子化多个远程调用),最好在provider实现端声明开启事务(原子化多个repository操作)。