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); } }