From d6100be4aa1e5508e90c9c3e9d6fadd513fcde6f Mon Sep 17 00:00:00 2001 From: 862911 Date: Fri, 9 Dec 2016 10:15:12 +0800 Subject: [PATCH] =?UTF-8?q?[=E9=9C=80=E6=B1=82](Issues=20#1261)=20?= =?UTF-8?q?=E8=A7=A3=E6=9E=90select=20for=20update=E6=97=B6=E5=BD=93?= =?UTF-8?q?=E5=81=9A=E6=98=AF=E6=9B=B4=E6=96=B0=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/io/mycat/route/RouteResultset.java | 10 ++++++++++ .../parser/druid/impl/DefaultDruidParser.java | 14 +++++++++++++- .../java/io/mycat/server/NonBlockingSession.java | 1 - .../java/io/mycat/server/ServerConnection.java | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/mycat/route/RouteResultset.java b/src/main/java/io/mycat/route/RouteResultset.java index 0dd82df14..f070839ee 100644 --- a/src/main/java/io/mycat/route/RouteResultset.java +++ b/src/main/java/io/mycat/route/RouteResultset.java @@ -81,6 +81,16 @@ public final class RouteResultset implements Serializable { //key=dataNode value=slot private Map dataNodeSlotMap=new HashMap<>(); + private boolean selectForUpdate; + + public boolean isSelectForUpdate() { + return selectForUpdate; + } + + public void setSelectForUpdate(boolean selectForUpdate) { + this.selectForUpdate = selectForUpdate; + } + public Map getDataNodeSlotMap() { return dataNodeSlotMap; } diff --git a/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java b/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java index 5bcb8d3c3..04c4d9c41 100644 --- a/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java +++ b/src/main/java/io/mycat/route/parser/druid/impl/DefaultDruidParser.java @@ -6,6 +6,9 @@ import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.druid.sql.ast.SQLStatement; @@ -95,7 +98,16 @@ public void visitorParse(RouteResultset rrs, SQLStatement stmt,MycatSchemaStatVi stmt.accept(visitor); ctx.setVisitor(visitor); - + + if(stmt instanceof SQLSelectStatement){ + SQLSelectQuery query = ((SQLSelectStatement) stmt).getSelect().getQuery(); + if(query instanceof MySqlSelectQueryBlock){ + if(((MySqlSelectQueryBlock)query).isForUpdate()){ + rrs.setSelectForUpdate(true); + } + } + } + List> mergedConditionList = new ArrayList>(); if(visitor.hasOrCondition()) {//包含or语句 //TODO diff --git a/src/main/java/io/mycat/server/NonBlockingSession.java b/src/main/java/io/mycat/server/NonBlockingSession.java index 1a52260d8..d840352cc 100644 --- a/src/main/java/io/mycat/server/NonBlockingSession.java +++ b/src/main/java/io/mycat/server/NonBlockingSession.java @@ -148,7 +148,6 @@ public void execute(RouteResultset rrs, int type) { } else { multiNodeHandler.execute(); } - } catch (Exception e) { LOGGER.warn(new StringBuilder().append(source).append(rrs).toString(), e); source.writeErrMessage(ErrorCode.ERR_HANDLE_DATA, e.toString()); diff --git a/src/main/java/io/mycat/server/ServerConnection.java b/src/main/java/io/mycat/server/ServerConnection.java index 08d61ffc9..a1db50ee8 100644 --- a/src/main/java/io/mycat/server/ServerConnection.java +++ b/src/main/java/io/mycat/server/ServerConnection.java @@ -285,7 +285,7 @@ public void routeEndExecuteSQL(String sql, int type, SchemaConfig schema) { } if (rrs != null) { // session执行 - session.execute(rrs, type); + session.execute(rrs, rrs.isSelectForUpdate()?ServerParse.UPDATE:type); } }