【异常】java.sql.SQLException:Connection is read-only.Queriesleadingto data modification are not allowed

在用项目开发的时候,调用接口报了以下错误:

TransientDataAccessResourceException :  
### Error updating database.  Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
 ### The error may involve defaultParameterMap
### The error occurred while setting parameters
 ### SQL: update t_trade         set delete_status = 0         where order_id = ?
 ### Cause: java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
2019-04-25 18:12:04.014 [ ERROR ] ->*            ; ]; Connection is read-only. Queries leading to data modification are not allowed; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

 查询资料后知道是事务配置的关系。报错的是接口方法名为:,

将get去掉后错误就没有了,原因是什么呢,原来是前辈在配置类中有这么一段代码:

// 创建事务通知
    @Bean(name = "txAdvice")
    public TransactionInterceptor getAdvisor() throws Exception {
        Properties properties = new Properties();
        properties.setProperty("get*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        properties.setProperty("find*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        properties.setProperty("query*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        properties.setProperty("select*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        properties.setProperty("list*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        properties.setProperty("search*", "PROPAGATION_REQUIRED,-Exception,readOnly");
        /*
         * 关闭所有不符合以上命名的方法都开启事务
         */
        //properties.setProperty("*", "PROPAGATION_REQUIRED,-Exception");
        TransactionInterceptor tsi = new TransactionInterceptor(transactionManager, properties);
        return tsi;
    }

前辈写了一个切面,凡是不符合这些名词的方法都开启事务并且设置了readOnly,是一个蛮实用的方法,省去很多方法都要加事务注解的麻烦。

 而我为什么会报错呢,是因为我再getTradeList()这个接口方法中有这个一个方法:

这个方法是对数据库的更新操作,但是前辈的配置中将get开头的方法都设置为了readOnly,所有不允许更新操作,导致了报错。

报同样错误的同学可以找找代码中关于事务的配置,是否在配置中将某些特定的方法设置为了readOnly,或者在service层中将这个方法的事务设置为了readOnly,当然,如果懒得话直接改下方法名称也是可以的。 

你可能感兴趣的:(★★报错记录汇总★)