### Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are

报错原因
在进行修改数据库的时候出现了这个异常,很明显这个是只读引起的
@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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值