数据库及druid版本: MySQL 8.0 druid 1.2.2 报错的SQL语句 SELECT * FROM table_name WHERE ref = ? AND flag = 0 LIMIT ? FOR UPDATE SKIP LOCKED
错误信息:
Caused by: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.2, syntax error: syntax error, error in :'SKIP LOCKED, pos 115, line 2, column 34, token IDENTIFIER LOCKED : SELECT * FROM table_name WHERE ref = ? AND flag = 0 LIMIT ? FOR UPDATE SKIP LOCKED at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:849) at com.alibaba.druid.wall.WallFilter.connection_prepareStatement(WallFilter.java:292) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:930) at com.alibaba.druid.filter.FilterEventAdapter.connection_prepareStatement(FilterEventAdapter.java:122) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:568) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:341) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:351) at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86) at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88) at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:108) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) at com.sun.proxy.$Proxy139.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 80 more Caused by: com.alibaba.druid.sql.parser.ParserException: syntax error, error in :'SKIP LOCKED, pos 115, line 2, column 34, token IDENTIFIER LOCKED at com.alibaba.druid.sql.parser.SQLParser.printError(SQLParser.java:558) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:602) at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:124) at com.alibaba.druid.wall.WallProvider.checkInternal(WallProvider.java:629) at com.alibaba.druid.wall.WallProvider.check(WallProvider.java:583) at com.alibaba.druid.wall.WallFilter.checkInternal(WallFilter.java:826) ... 105 more
原提问者GitHub用户ulqio
ption 异常。这种异常通常是由于 MySQL 解析器无法正确解析 'SKIP LOCKED' 关键字的语法和结构,或者存在其他语法问题导致的。
为了解决这个问题,可以考虑以下几个方面:
检查 MySQL 的版本。在使用 'SKIP LOCKED' 关键字时,需要确保使用的 MySQL 版本为 8.0 或者更高版本。如果使用的 MySQL 版本过低,可能不支持 'SKIP LOCKED' 关键字,需要升级 MySQL 版本或者使用其他的语法和方式。
检查 'SKIP LOCKED' 关键字的语法。在使用 'SKIP LOCKED' 关键字时,需要确保语法正确,遵循标准的 MySQL 语法规范和语法要求。可以参考 MySQL 官方文档或者其他相关资料,了解 'SKIP LOCKED' 关键字的语法和用法。
检查 MySQL 解析器的配置。在使用 MySQL 解析器时,需要确保解析器的配置正确,并且支持 'SKIP LOCKED' 关键字的语法和要求。可以参考 MySQL 解析器的官方文档或者其他相关资料,了解解析器的配置和支持情况。
尝试其他的 SQL 查询方式。如果 MySQL 解析器无法解析 'SKIP LOCKED' 关键字,可以尝试使用其他的 SQL 查询方式,例如 SELECT ... FOR UPDATE 或者 SELECT ... LOCK IN SHARE MODE 等。这些语法可以更好地支持各种 SQL 操作和语法。
错误信息指出了sql injection violation,并且指出了在'SKIP LOCKED处存在语法错误。
原因是在MySQL 8.0中,SKIP LOCKED是一种用于SELECT语句的新特性,用于在并发情况下跳过被其他事务锁定的行。然而,在Druid 1.2.2版本中,对于SKIP LOCKED的语法解析支持有限,导致了错误的报错。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
根据错误信息显示,Druid版本1.2.2不支持MySQL 8.0中的SKIP LOCKED
语法。该语法用于在MySQL事务中跳过锁定的行。然而,在Druid 1.2.2中,这个语法被视为SQL注入违规,因此抛出了sql injection violation
异常。
解决方法:
SKIP LOCKED
语法。FOR UPDATE SKIP LOCKED
部分移除。请注意,这样修改可能会影响到应用程序的逻辑和预期结果,因为不能跳过已锁定的行。选择适当的解决方法取决于您的需求和约束。如果您需要使用SKIP LOCKED
语法,并且没有其他限制,建议升级到较新的Druid版本。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。