报错原因
在进行修改数据库的时候出现了这个异常,很明显这个是只读引起的
@RequiredLog(operation = “查询用户”)和@Transactional(readOnly = true)
其中@RequiredLog(operation = “查询用户”)涉及了保存操作,而在事务上是只读,故报错
@RequiredLog(operation = "查询用户")
@Transactional(readOnly = true)
@Override
public PageObject<SysUserDeptVo> findPageObjects(String username, Integer pageCurrent) {
//1.参数校验
Assert.isValid(pageCurrent!=null&&pageCurrent>0, "当前页码值不正确");
//3.查询当前页记录
int pageSize=pageProperties.getPageSize();
Page<SysUser> page = PageHelper.startPage(pageCurrent,pageSize);
List<SysUserDeptVo> records=
sysUserDao.findPageObjects(username);
//4.封装查询结果
return new PageObject<>(records, (int)page.getTotal(), pageCurrent, pageSize);
}
解决办法一
在写操作的aop中添加优先级@Order(1)
@Order(1)
@Aspect
@Component
@Slf4j
public class SysLogAspect {
xxxx
}
解决办法二
将涉及保存操作的方法上添加@Transactional(propagation = Propagation.REQUIRES_NEW),即使用一个新的事务,不和容易报错的只读事务在同一个事务。
/**
* 保存日志信息
*
* @param entity
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void saveObject(SysLog entity) {
sysLogDao.insertObject(entity);
}
方法三
<!-- 事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" propagation="REQUIRED" read-only="true"/>
<tx:method name="find*" propagation="REQUIRED" read-only="true"/>
<tx:method name="query*" propagation="REQUIRED" read-only="true"/>
</tx:attributes>
观察aop的xml配置文件,如果你的service方法名称是findpassword的话那么就会被拦截到了,然后就read-only了
所以改一下你的方法名称吧
方法四
在方法上添加@Transactional(readOnly = false)