接手一个Mybtisplus的项目,采用Jpa进行重构。在Service层有原来的Mybatis的访问数据库的代码。在替换过程中,是逐渐替换的,会存在在一个Service方法中,访问数据库的代码,有Jpa,与Mybatis共存的情况。
stevenclaro opened this issue · 1 comments
@transactional
@OverRide
//是根据每一条的Task及FileID来执行这一个分解为子任务的
public Result startRuleReview(Integer id) {
//1.校验
String key = RedisKeyConstants.FILE_REVIEW.concat(String.valueOf(id));
boolean lock = jedisUtils.lock(key, NumberConstants.THIRTY);
if (!lock) {
return Result.createError("任务锁定中");
}
//RuleReviewTask task = ruleReviewTaskMapper.selectByPrimaryKey(id);
JPARuleReviewTask task=jpaTaskRepository.getOne(id.longValue());
if (!ReviewTaskStateEnum.WATI_RULE_REVIEW.getState().equals(task.getStatus())) {
return Result.createError("任务状态非待规则审核");
}
//2.子任务创建
ruleReviewDetailMapper.delByTaskId(id);
//创建之前,在子任务中,先将该主任务的id关联的记录,先删除掉.这个是异常数据检查.这个暂时用Mybtis
//检查一下,在一个Transaction下,2种混合应用,可能存在的问题。如果不用,业务上需要单独将子表中的相关记录删除,但是主表的记录不动。
//下面的代码,整体上是将主任务根据manufactureid分解为子任务,并更新子任务的状态
//根据这个机构选择的规则集合,这样选择就是持久化的选择集合。也可以是每次让用户来传入这个规则集合。
List<RuleInfoDto>rules = ruleMapper.queryByDepart(task.getSysDepartId());
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
connection:
handling_mode: DELAYED_ACQUISITION_AND_HOLD
event:
merge:
entity_copy_observer: allow
open-in-view: false
问题描述
用户请求在碰到方法上的Tranaction注解的时候,会开启一个Session
然后在方法体中,
第一次 碰到Jpa dao层,开启事务,获取数据库连接,执行后不关闭 事务,但是没有关闭数据库连接。
第二次 碰到 Mybatis dao 层,根据事务传播机制,获取Jpa上获取的事务,获取数据库连接,执行后不关闭事务,没有关闭数据库连接。
方法体退出时候,关闭事务,关闭连接,关闭Session
这个理解是否正确,在jpa,与mybatis 2个dao层混用的情况下,原理得比较清楚,否则错误很难排查?
需要搞清楚:数据源,连接,事务的关系。