开发者社区> 问答> 正文

使用'SKIP LOCKED'(MySQL8.0)关键字抛出ParserException: syn

数据库及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

展开
收起
山海行 2023-07-05 18:13:10 110 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    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 操作和语法。

    2023-07-30 20:00:11
    赞同 展开评论 打赏
  • 错误信息指出了sql injection violation,并且指出了在'SKIP LOCKED处存在语法错误。

    原因是在MySQL 8.0中,SKIP LOCKED是一种用于SELECT语句的新特性,用于在并发情况下跳过被其他事务锁定的行。然而,在Druid 1.2.2版本中,对于SKIP LOCKED的语法解析支持有限,导致了错误的报错。

    2023-07-11 09:09:27
    赞同 展开评论 打赏
  • 问题已修复,请用新版本

    https://github.com/alibaba/druid/releases/tag/1.2.5

    原回答者GitHub用户wenshao

    2023-07-06 10:48:00
    赞同 展开评论 打赏
  • 根据错误信息显示,Druid版本1.2.2不支持MySQL 8.0中的SKIP LOCKED语法。该语法用于在MySQL事务中跳过锁定的行。然而,在Druid 1.2.2中,这个语法被视为SQL注入违规,因此抛出了sql injection violation异常。

    解决方法:

    1. 升级到较新版本的Druid,以便支持SKIP LOCKED语法。
    2. 修改SQL语句,将FOR UPDATE SKIP LOCKED部分移除。请注意,这样修改可能会影响到应用程序的逻辑和预期结果,因为不能跳过已锁定的行。

    选择适当的解决方法取决于您的需求和约束。如果您需要使用SKIP LOCKED语法,并且没有其他限制,建议升级到较新的Druid版本。

    2023-07-05 19:00:20
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像