This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new de6fb5830ac Refactor TCLStatement (#35569)
de6fb5830ac is described below

commit de6fb5830ac0ebb7e67fb69c8f0ac6c9952e626d
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Mon Jun 2 11:40:30 2025 +0800

    Refactor TCLStatement (#35569)
    
    * Refactor TCLStatement
    
    * Refactor TCLStatement
    
    * Refactor TCLStatement
    
    * Refactor TCLStatement
---
 .../type/ClickHouseTCLStatementVisitor.java        |   1 -
 .../statement/type/DorisTCLStatementVisitor.java   | 103 +++++++++++----------
 .../type/FirebirdTCLStatementVisitor.java          |   2 +-
 .../statement/type/MySQLTCLStatementVisitor.java   | 103 +++++++++++----------
 .../type/OpenGaussTCLStatementVisitor.java         |  14 +--
 .../statement/type/OracleTCLStatementVisitor.java  |  14 +--
 .../type/PostgreSQLTCLStatementVisitor.java        |  76 +++++++--------
 .../type/SQLServerTCLStatementVisitor.java         |  32 +++----
 .../tcl/BeginDistributedTransactionStatement.java  |   2 +-
 .../statement/tcl/BeginTransactionStatement.java   |   2 +-
 .../core/statement/tcl/CheckpointStatement.java    |   2 +-
 .../statement/tcl/CommitPreparedStatement.java     |   2 +-
 .../core/statement/tcl/CommitStatement.java        |   2 +-
 .../core/statement/tcl/LockStatement.java          |   7 +-
 .../statement/tcl/PrepareTransactionStatement.java |   2 +-
 .../statement/tcl/ReleaseSavepointStatement.java   |   8 +-
 .../statement/tcl/RollbackPreparedStatement.java   |   2 +-
 .../core/statement/tcl/RollbackStatement.java      |  14 +--
 .../core/statement/tcl/SavepointStatement.java     |   8 +-
 .../core/statement/tcl/SetAutoCommitStatement.java |   8 +-
 .../statement/tcl/SetConstraintsStatement.java     |   2 +-
 .../statement/tcl/SetTransactionStatement.java     |  50 +++++++---
 .../statement/tcl/StartTransactionStatement.java   |   2 +-
 .../core/statement/tcl/UnlockStatement.java        |   2 +-
 .../backend/handler/tcl/SetTransactionHandler.java |   9 +-
 .../handler/tcl/TCLBackendHandlerFactory.java      |   2 +-
 26 files changed, 236 insertions(+), 235 deletions(-)

diff --git 
a/parser/sql/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/clickhouse/visitor/statement/type/ClickHouseTCLStatementVisitor.java
 
b/parser/sql/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/clickhouse/visitor/statement/type/ClickHouseTCLStatementVisitor.java
index 34b0cfb7b16..b33540a5a3b 100644
--- 
a/parser/sql/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/clickhouse/visitor/statement/type/ClickHouseTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/clickhouse/src/main/java/org/apache/shardingsphere/sql/parser/clickhouse/visitor/statement/type/ClickHouseTCLStatementVisitor.java
@@ -24,5 +24,4 @@ import 
org.apache.shardingsphere.sql.parser.clickhouse.visitor.statement.ClickHo
  * ClickHouse TCL statement visitor.
  */
 public final class ClickHouseTCLStatementVisitor extends 
ClickHouseStatementVisitor implements TCLStatementVisitor {
-    
 }
diff --git 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisTCLStatementVisitor.java
 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisTCLStatementVisitor.java
index 61c71f6841d..7a036d9c973 100644
--- 
a/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/doris/src/main/java/org/apache/shardingsphere/sql/parser/doris/visitor/statement/type/DorisTCLStatementVisitor.java
@@ -22,13 +22,16 @@ import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.TCLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.BeginTransactionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.CommitContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.IsolationTypesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.LockContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.OptionTypeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.ReleaseSavepointContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.RollbackContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SavepointContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SetAutoCommitContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.SetTransactionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.TableLockContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.TransactionAccessModeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.UnlockContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.XaBeginContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.DorisStatementParser.XaCommitContext;
@@ -61,6 +64,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XARo
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -71,46 +75,59 @@ public final class DorisTCLStatementVisitor extends 
DorisStatementVisitor implem
     
     @Override
     public ASTNode visitSetTransaction(final SetTransactionContext ctx) {
-        SetTransactionStatement result = new SetTransactionStatement();
-        if (null != ctx.optionType()) {
-            OperationScope scope = null;
-            if (null != ctx.optionType().SESSION()) {
-                scope = OperationScope.SESSION;
-            } else if (null != ctx.optionType().GLOBAL()) {
-                scope = OperationScope.GLOBAL;
-            }
-            result.setScope(scope);
+        return new SetTransactionStatement(getOperationScope(ctx.optionType()),
+                getTransactionIsolationLevel(null == 
ctx.transactionCharacteristics().isolationLevel() ? null : 
ctx.transactionCharacteristics().isolationLevel().isolationTypes()),
+                
getTransactionAccessType(ctx.transactionCharacteristics().transactionAccessMode()));
+    }
+    
+    private OperationScope getOperationScope(final OptionTypeContext ctx) {
+        if (null == ctx) {
+            return null;
         }
-        if (null != ctx.transactionCharacteristics().isolationLevel()) {
-            TransactionIsolationLevel isolationLevel = null;
-            if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().SERIALIZABLE())
 {
-                isolationLevel = TransactionIsolationLevel.SERIALIZABLE;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().COMMITTED()) 
{
-                isolationLevel = TransactionIsolationLevel.READ_COMMITTED;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().UNCOMMITTED())
 {
-                isolationLevel = TransactionIsolationLevel.READ_UNCOMMITTED;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().REPEATABLE())
 {
-                isolationLevel = TransactionIsolationLevel.REPEATABLE_READ;
-            }
-            result.setIsolationLevel(isolationLevel);
+        if (null != ctx.SESSION()) {
+            return OperationScope.SESSION;
         }
-        if (null != ctx.transactionCharacteristics().transactionAccessMode()) {
-            TransactionAccessType accessType = null;
-            if (null != 
ctx.transactionCharacteristics().transactionAccessMode().ONLY()) {
-                accessType = TransactionAccessType.READ_ONLY;
-            } else if (null != 
ctx.transactionCharacteristics().transactionAccessMode().WRITE()) {
-                accessType = TransactionAccessType.READ_WRITE;
-            }
-            result.setAccessMode(accessType);
+        if (null != ctx.GLOBAL()) {
+            return OperationScope.GLOBAL;
         }
-        return result;
+        return null;
+    }
+    
+    private TransactionIsolationLevel getTransactionIsolationLevel(final 
IsolationTypesContext ctx) {
+        if (null == ctx) {
+            return null;
+        }
+        if (null != ctx.SERIALIZABLE()) {
+            return TransactionIsolationLevel.SERIALIZABLE;
+        }
+        if (null != ctx.COMMITTED()) {
+            return TransactionIsolationLevel.READ_COMMITTED;
+        }
+        if (null != ctx.UNCOMMITTED()) {
+            return TransactionIsolationLevel.READ_UNCOMMITTED;
+        }
+        if (null != ctx.REPEATABLE()) {
+            return TransactionIsolationLevel.REPEATABLE_READ;
+        }
+        return null;
+    }
+    
+    private TransactionAccessType getTransactionAccessType(final 
TransactionAccessModeContext ctx) {
+        if (null == ctx) {
+            return null;
+        }
+        if (null != ctx.ONLY()) {
+            return TransactionAccessType.READ_ONLY;
+        }
+        if (null != ctx.WRITE()) {
+            return TransactionAccessType.READ_WRITE;
+        }
+        return null;
     }
     
     @Override
     public ASTNode visitSetAutoCommit(final SetAutoCommitContext ctx) {
-        SetAutoCommitStatement result = new SetAutoCommitStatement();
-        
result.setAutoCommit(generateAutoCommitSegment(ctx.autoCommitValue).isAutoCommit());
-        return result;
+        return new 
SetAutoCommitStatement(generateAutoCommitSegment(ctx.autoCommitValue).isAutoCommit());
     }
     
     private AutoCommitSegment generateAutoCommitSegment(final Token ctx) {
@@ -130,25 +147,17 @@ public final class DorisTCLStatementVisitor extends 
DorisStatementVisitor implem
     
     @Override
     public ASTNode visitRollback(final RollbackContext ctx) {
-        RollbackStatement result = new RollbackStatement();
-        if (null != ctx.identifier()) {
-            result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        }
-        return result;
+        return null == ctx.identifier() ? new RollbackStatement() : new 
RollbackStatement(((IdentifierValue) visit(ctx.identifier())).getValue());
     }
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        SavepointStatement result = new SavepointStatement();
-        result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        return result;
+        return new SavepointStatement(((IdentifierValue) 
visit(ctx.identifier())).getValue());
     }
     
     @Override
     public ASTNode visitReleaseSavepoint(final ReleaseSavepointContext ctx) {
-        ReleaseSavepointStatement result = new ReleaseSavepointStatement();
-        result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        return result;
+        return new ReleaseSavepointStatement(((IdentifierValue) 
visit(ctx.identifier())).getValue());
     }
     
     @Override
@@ -183,11 +192,7 @@ public final class DorisTCLStatementVisitor extends 
DorisStatementVisitor implem
     
     @Override
     public ASTNode visitLock(final LockContext ctx) {
-        LockStatement result = new LockStatement();
-        if (null != ctx.tableLock()) {
-            result.getTables().addAll(getLockTables(ctx.tableLock()));
-        }
-        return result;
+        return new LockStatement(null == ctx.tableLock() ? 
Collections.emptyList() : getLockTables(ctx.tableLock()));
     }
     
     private Collection<SimpleTableSegment> getLockTables(final 
List<TableLockContext> tableLockContexts) {
diff --git 
a/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdTCLStatementVisitor.java
 
b/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdTCLStatementVisitor.java
index e06186c6b22..a5e18f5a918 100644
--- 
a/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/firebird/src/main/java/org/apache/shardingsphere/sql/parser/firebird/visitor/statement/type/FirebirdTCLStatementVisitor.java
@@ -51,6 +51,6 @@ public final class FirebirdTCLStatementVisitor extends 
FirebirdStatementVisitor
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        return new SavepointStatement();
+        return new SavepointStatement(null);
     }
 }
diff --git 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
index 15d0362b1ad..f33d360c57b 100644
--- 
a/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/type/MySQLTCLStatementVisitor.java
@@ -22,13 +22,16 @@ import org.apache.shardingsphere.sql.parser.api.ASTNode;
 import 
org.apache.shardingsphere.sql.parser.api.visitor.statement.type.TCLStatementVisitor;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.BeginTransactionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.CommitContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.IsolationTypesContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.LockContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.OptionTypeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.ReleaseSavepointContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.RollbackContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SavepointContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetAutoCommitContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.SetTransactionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TableLockContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.TransactionAccessModeContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.UnlockContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.XaBeginContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.MySQLStatementParser.XaCommitContext;
@@ -61,6 +64,7 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.xa.XARo
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -71,46 +75,59 @@ public final class MySQLTCLStatementVisitor extends 
MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitSetTransaction(final SetTransactionContext ctx) {
-        SetTransactionStatement result = new SetTransactionStatement();
-        if (null != ctx.optionType()) {
-            OperationScope scope = null;
-            if (null != ctx.optionType().SESSION()) {
-                scope = OperationScope.SESSION;
-            } else if (null != ctx.optionType().GLOBAL()) {
-                scope = OperationScope.GLOBAL;
-            }
-            result.setScope(scope);
+        return new SetTransactionStatement(getOperationScope(ctx.optionType()),
+                getTransactionIsolationLevel(null == 
ctx.transactionCharacteristics().isolationLevel() ? null : 
ctx.transactionCharacteristics().isolationLevel().isolationTypes()),
+                
getTransactionAccessType(ctx.transactionCharacteristics().transactionAccessMode()));
+    }
+    
+    private OperationScope getOperationScope(final OptionTypeContext ctx) {
+        if (null == ctx) {
+            return null;
         }
-        if (null != ctx.transactionCharacteristics().isolationLevel()) {
-            TransactionIsolationLevel isolationLevel = null;
-            if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().SERIALIZABLE())
 {
-                isolationLevel = TransactionIsolationLevel.SERIALIZABLE;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().COMMITTED()) 
{
-                isolationLevel = TransactionIsolationLevel.READ_COMMITTED;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().UNCOMMITTED())
 {
-                isolationLevel = TransactionIsolationLevel.READ_UNCOMMITTED;
-            } else if (null != 
ctx.transactionCharacteristics().isolationLevel().isolationTypes().REPEATABLE())
 {
-                isolationLevel = TransactionIsolationLevel.REPEATABLE_READ;
-            }
-            result.setIsolationLevel(isolationLevel);
+        if (null != ctx.SESSION()) {
+            return OperationScope.SESSION;
         }
-        if (null != ctx.transactionCharacteristics().transactionAccessMode()) {
-            TransactionAccessType accessType = null;
-            if (null != 
ctx.transactionCharacteristics().transactionAccessMode().ONLY()) {
-                accessType = TransactionAccessType.READ_ONLY;
-            } else if (null != 
ctx.transactionCharacteristics().transactionAccessMode().WRITE()) {
-                accessType = TransactionAccessType.READ_WRITE;
-            }
-            result.setAccessMode(accessType);
+        if (null != ctx.GLOBAL()) {
+            return OperationScope.GLOBAL;
         }
-        return result;
+        return null;
+    }
+    
+    private TransactionIsolationLevel getTransactionIsolationLevel(final 
IsolationTypesContext ctx) {
+        if (null == ctx) {
+            return null;
+        }
+        if (null != ctx.SERIALIZABLE()) {
+            return TransactionIsolationLevel.SERIALIZABLE;
+        }
+        if (null != ctx.COMMITTED()) {
+            return TransactionIsolationLevel.READ_COMMITTED;
+        }
+        if (null != ctx.UNCOMMITTED()) {
+            return TransactionIsolationLevel.READ_UNCOMMITTED;
+        }
+        if (null != ctx.REPEATABLE()) {
+            return TransactionIsolationLevel.REPEATABLE_READ;
+        }
+        return null;
+    }
+    
+    private TransactionAccessType getTransactionAccessType(final 
TransactionAccessModeContext ctx) {
+        if (null == ctx) {
+            return null;
+        }
+        if (null != ctx.ONLY()) {
+            return TransactionAccessType.READ_ONLY;
+        }
+        if (null != ctx.WRITE()) {
+            return TransactionAccessType.READ_WRITE;
+        }
+        return null;
     }
     
     @Override
     public ASTNode visitSetAutoCommit(final SetAutoCommitContext ctx) {
-        SetAutoCommitStatement result = new SetAutoCommitStatement();
-        
result.setAutoCommit(generateAutoCommitSegment(ctx.autoCommitValue).isAutoCommit());
-        return result;
+        return new 
SetAutoCommitStatement(generateAutoCommitSegment(ctx.autoCommitValue).isAutoCommit());
     }
     
     private AutoCommitSegment generateAutoCommitSegment(final Token ctx) {
@@ -130,25 +147,17 @@ public final class MySQLTCLStatementVisitor extends 
MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitRollback(final RollbackContext ctx) {
-        RollbackStatement result = new RollbackStatement();
-        if (null != ctx.identifier()) {
-            result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        }
-        return result;
+        return null == ctx.identifier() ? new RollbackStatement() : new 
RollbackStatement(((IdentifierValue) visit(ctx.identifier())).getValue());
     }
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        SavepointStatement result = new SavepointStatement();
-        result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        return result;
+        return new SavepointStatement(((IdentifierValue) 
visit(ctx.identifier())).getValue());
     }
     
     @Override
     public ASTNode visitReleaseSavepoint(final ReleaseSavepointContext ctx) {
-        ReleaseSavepointStatement result = new ReleaseSavepointStatement();
-        result.setSavepointName(((IdentifierValue) 
visit(ctx.identifier())).getValue());
-        return result;
+        return new ReleaseSavepointStatement(((IdentifierValue) 
visit(ctx.identifier())).getValue());
     }
     
     @Override
@@ -183,11 +192,7 @@ public final class MySQLTCLStatementVisitor extends 
MySQLStatementVisitor implem
     
     @Override
     public ASTNode visitLock(final LockContext ctx) {
-        LockStatement result = new LockStatement();
-        if (null != ctx.tableLock()) {
-            result.getTables().addAll(getLockTables(ctx.tableLock()));
-        }
-        return result;
+        return new LockStatement(null == ctx.tableLock() ? 
Collections.emptyList() : getLockTables(ctx.tableLock()));
     }
     
     private Collection<SimpleTableSegment> getLockTables(final 
List<TableLockContext> tableLockContexts) {
diff --git 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussTCLStatementVisitor.java
 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussTCLStatementVisitor.java
index c956425c817..f298fc15dec 100644
--- 
a/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/opengauss/src/main/java/org/apache/shardingsphere/sql/parser/opengauss/visitor/statement/type/OpenGaussTCLStatementVisitor.java
@@ -78,25 +78,17 @@ public final class OpenGaussTCLStatementVisitor extends 
OpenGaussStatementVisito
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        String savepointName = ctx.colId().getText();
-        SavepointStatement result = new SavepointStatement();
-        result.setSavepointName(savepointName);
-        return result;
+        return new SavepointStatement(ctx.colId().getText());
     }
     
     @Override
     public ASTNode visitRollbackToSavepoint(final RollbackToSavepointContext 
ctx) {
-        RollbackStatement result = new RollbackStatement();
-        result.setSavepointName(ctx.colId().getText());
-        return result;
+        return new RollbackStatement(ctx.colId().getText());
     }
     
     @Override
     public ASTNode visitReleaseSavepoint(final ReleaseSavepointContext ctx) {
-        String savepointName = ctx.colId().getText();
-        ReleaseSavepointStatement result = new ReleaseSavepointStatement();
-        result.setSavepointName(savepointName);
-        return result;
+        return new ReleaseSavepointStatement(ctx.colId().getText());
     }
     
     @Override
diff --git 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleTCLStatementVisitor.java
 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleTCLStatementVisitor.java
index 7a507af25ca..e7555c9f24a 100644
--- 
a/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/type/OracleTCLStatementVisitor.java
@@ -34,6 +34,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SetCons
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SetTransactionStatement;
 import 
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
 
+import java.util.Collections;
+
 /**
  * TCL statement visitor for Oracle.
  */
@@ -51,18 +53,12 @@ public final class OracleTCLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitRollback(final RollbackContext ctx) {
-        RollbackStatement result = new RollbackStatement();
-        if (null != ctx.savepointClause().savepointName()) {
-            result.setSavepointName(((IdentifierValue) 
visit(ctx.savepointClause().savepointName())).getValue());
-        }
-        return result;
+        return null == ctx.savepointClause().savepointName() ? new 
RollbackStatement() : new RollbackStatement(((IdentifierValue) 
visit(ctx.savepointClause().savepointName())).getValue());
     }
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        SavepointStatement result = new SavepointStatement();
-        result.setSavepointName(((IdentifierValue) 
visit(ctx.savepointName())).getValue());
-        return result;
+        return new SavepointStatement(((IdentifierValue) 
visit(ctx.savepointName())).getValue());
     }
     
     @Override
@@ -72,6 +68,6 @@ public final class OracleTCLStatementVisitor extends 
OracleStatementVisitor impl
     
     @Override
     public ASTNode visitLock(final LockContext ctx) {
-        return new LockStatement();
+        return new LockStatement(Collections.emptyList());
     }
 }
diff --git 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLTCLStatementVisitor.java
 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLTCLStatementVisitor.java
index 0a20722f8b4..c392c8f4b5e 100644
--- 
a/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/postgresql/src/main/java/org/apache/shardingsphere/sql/parser/postgresql/visitor/statement/type/PostgreSQLTCLStatementVisitor.java
@@ -25,6 +25,7 @@ import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.Ch
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.CommitContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.CommitPreparedContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.EndContext;
+import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.IsoLevelContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.LockContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.PrepareTransactionContext;
 import 
org.apache.shardingsphere.sql.parser.autogen.PostgreSQLStatementParser.RelationExprContext;
@@ -56,8 +57,8 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.SetTran
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.tcl.StartTransactionStatement;
 
 import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.Collections;
+import java.util.stream.Collectors;
 
 /**
  * TCL statement visitor for PostgreSQL.
@@ -68,43 +69,45 @@ public final class PostgreSQLTCLStatementVisitor extends 
PostgreSQLStatementVisi
     public ASTNode visitSetTransaction(final SetTransactionContext ctx) {
         SetTransactionStatement result = new SetTransactionStatement();
         if (null != ctx.transactionModeList()) {
-            ctx.transactionModeList().transactionModeItem().forEach(each -> {
-                result.setAccessMode(getTransactionAccessType(each));
-                result.setIsolationLevel(getTransactionIsolationLevel(each));
-            });
+            for (TransactionModeItemContext each : 
ctx.transactionModeList().transactionModeItem()) {
+                result = new SetTransactionStatement(null, 
getTransactionIsolationLevel(each.isoLevel()), getTransactionAccessType(each));
+            }
         }
         return result;
     }
     
-    private TransactionAccessType getTransactionAccessType(final 
TransactionModeItemContext modeItemContext) {
-        if (null != modeItemContext.ONLY()) {
-            return TransactionAccessType.READ_ONLY;
-        }
-        if (null != modeItemContext.WRITE()) {
-            return TransactionAccessType.READ_WRITE;
-        }
-        return null;
-    }
-    
-    private TransactionIsolationLevel getTransactionIsolationLevel(final 
TransactionModeItemContext modeItemContext) {
-        if (null == modeItemContext.isoLevel()) {
+    private TransactionIsolationLevel getTransactionIsolationLevel(final 
IsoLevelContext ctx) {
+        if (null == ctx) {
             return null;
         }
-        if (null != modeItemContext.isoLevel().UNCOMMITTED()) {
+        if (null != ctx.UNCOMMITTED()) {
             return TransactionIsolationLevel.READ_UNCOMMITTED;
         }
-        if (null != modeItemContext.isoLevel().COMMITTED()) {
+        if (null != ctx.COMMITTED()) {
             return TransactionIsolationLevel.READ_COMMITTED;
         }
-        if (null != modeItemContext.isoLevel().REPEATABLE()) {
+        if (null != ctx.REPEATABLE()) {
             return TransactionIsolationLevel.REPEATABLE_READ;
         }
-        if (null != modeItemContext.isoLevel().SERIALIZABLE()) {
+        if (null != ctx.SERIALIZABLE()) {
             return TransactionIsolationLevel.SERIALIZABLE;
         }
         return null;
     }
     
+    private TransactionAccessType getTransactionAccessType(final 
TransactionModeItemContext ctx) {
+        if (null == ctx) {
+            return null;
+        }
+        if (null != ctx.ONLY()) {
+            return TransactionAccessType.READ_ONLY;
+        }
+        if (null != ctx.WRITE()) {
+            return TransactionAccessType.READ_WRITE;
+        }
+        return null;
+    }
+    
     @Override
     public ASTNode visitBeginTransaction(final BeginTransactionContext ctx) {
         return new BeginTransactionStatement();
@@ -127,25 +130,17 @@ public final class PostgreSQLTCLStatementVisitor extends 
PostgreSQLStatementVisi
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        String savepointName = ctx.colId().getText();
-        SavepointStatement result = new SavepointStatement();
-        result.setSavepointName(savepointName);
-        return result;
+        return new SavepointStatement(ctx.colId().getText());
     }
     
     @Override
     public ASTNode visitRollbackToSavepoint(final RollbackToSavepointContext 
ctx) {
-        RollbackStatement result = new RollbackStatement();
-        result.setSavepointName(ctx.colId().getText());
-        return result;
+        return new RollbackStatement(ctx.colId().getText());
     }
     
     @Override
     public ASTNode visitReleaseSavepoint(final ReleaseSavepointContext ctx) {
-        String savepointName = ctx.colId().getText();
-        ReleaseSavepointStatement result = new ReleaseSavepointStatement();
-        result.setSavepointName(savepointName);
-        return result;
+        return new ReleaseSavepointStatement(ctx.colId().getText());
     }
     
     @Override
@@ -175,20 +170,11 @@ public final class PostgreSQLTCLStatementVisitor extends 
PostgreSQLStatementVisi
     
     @Override
     public ASTNode visitLock(final LockContext ctx) {
-        LockStatement result = new LockStatement();
-        if (null != ctx.relationExprList()) {
-            
result.getTables().addAll(getLockTables(ctx.relationExprList().relationExpr()));
-        }
-        return result;
+        return new LockStatement(null == ctx.relationExprList() ? 
Collections.emptyList() : getLockTables(ctx.relationExprList().relationExpr()));
     }
     
-    private Collection<SimpleTableSegment> getLockTables(final 
List<RelationExprContext> relationExprContexts) {
-        Collection<SimpleTableSegment> result = new LinkedList<>();
-        for (RelationExprContext each : relationExprContexts) {
-            SimpleTableSegment tableSegment = (SimpleTableSegment) 
visit(each.qualifiedName());
-            result.add(tableSegment);
-        }
-        return result;
+    private Collection<SimpleTableSegment> getLockTables(final 
Collection<RelationExprContext> relationExprContexts) {
+        return relationExprContexts.stream().map(each -> (SimpleTableSegment) 
visit(each.qualifiedName())).collect(Collectors.toList());
     }
     
     @Override
diff --git 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerTCLStatementVisitor.java
 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerTCLStatementVisitor.java
index 18124b63cd5..2e5685f3746 100644
--- 
a/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerTCLStatementVisitor.java
+++ 
b/parser/sql/dialect/sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/type/SQLServerTCLStatementVisitor.java
@@ -46,32 +46,28 @@ public final class SQLServerTCLStatementVisitor extends 
SQLServerStatementVisito
     
     @Override
     public ASTNode visitSetTransaction(final SetTransactionContext ctx) {
-        SetTransactionStatement result = new SetTransactionStatement();
-        
result.setIsolationLevel(getTransactionIsolationLevel(ctx.isolationLevel()));
-        return result;
+        return new SetTransactionStatement(null, 
getTransactionIsolationLevel(ctx.isolationLevel()), null);
     }
     
     private TransactionIsolationLevel getTransactionIsolationLevel(final 
IsolationLevelContext ctx) {
-        TransactionIsolationLevel result;
         if (null != ctx.UNCOMMITTED()) {
-            result = TransactionIsolationLevel.READ_UNCOMMITTED;
-        } else if (null != ctx.COMMITTED()) {
-            result = TransactionIsolationLevel.READ_COMMITTED;
-        } else if (null != ctx.REPEATABLE()) {
-            result = TransactionIsolationLevel.REPEATABLE_READ;
-        } else if (null != ctx.SNAPSHOT()) {
-            result = TransactionIsolationLevel.SNAPSHOT;
-        } else {
-            result = TransactionIsolationLevel.SERIALIZABLE;
+            return TransactionIsolationLevel.READ_UNCOMMITTED;
         }
-        return result;
+        if (null != ctx.COMMITTED()) {
+            return TransactionIsolationLevel.READ_COMMITTED;
+        }
+        if (null != ctx.REPEATABLE()) {
+            return TransactionIsolationLevel.REPEATABLE_READ;
+        }
+        if (null != ctx.SNAPSHOT()) {
+            return TransactionIsolationLevel.SNAPSHOT;
+        }
+        return TransactionIsolationLevel.SERIALIZABLE;
     }
     
     @Override
     public ASTNode visitSetImplicitTransactions(final 
SetImplicitTransactionsContext ctx) {
-        SetAutoCommitStatement result = new SetAutoCommitStatement();
-        
result.setAutoCommit("ON".equalsIgnoreCase(ctx.implicitTransactionsValue().getText()));
-        return result;
+        return new 
SetAutoCommitStatement("ON".equalsIgnoreCase(ctx.implicitTransactionsValue().getText()));
     }
     
     @Override
@@ -106,6 +102,6 @@ public final class SQLServerTCLStatementVisitor extends 
SQLServerStatementVisito
     
     @Override
     public ASTNode visitSavepoint(final SavepointContext ctx) {
-        return new SavepointStatement();
+        return new SavepointStatement(null);
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginDistributedTransactionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginDistributedTransactionStatement.java
index cf5dd8b1987..a0865b8deca 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginDistributedTransactionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginDistributedTransactionStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Begin distributed transaction statement.
  */
-public class BeginDistributedTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
+public final class BeginDistributedTransactionStatement extends 
AbstractSQLStatement implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginTransactionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginTransactionStatement.java
index cf00c85731d..d6720705ba2 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginTransactionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/BeginTransactionStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Begin transaction statement.
  */
-public class BeginTransactionStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class BeginTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CheckpointStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CheckpointStatement.java
index e8422a8effa..de761d1f630 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CheckpointStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CheckpointStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Checkpoint statement.
  */
-public class CheckpointStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class CheckpointStatement extends AbstractSQLStatement implements 
TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitPreparedStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitPreparedStatement.java
index 892d7394782..90036bd2f2c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitPreparedStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitPreparedStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Commit prepared statement.
  */
-public class CommitPreparedStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class CommitPreparedStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitStatement.java
index a99b0203453..9e0d8d18a9e 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/CommitStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Commit statement.
  */
-public class CommitStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class CommitStatement extends AbstractSQLStatement implements 
TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/LockStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/LockStatement.java
index 854598e4175..fadea63fc2e 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/LockStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/LockStatement.java
@@ -18,17 +18,18 @@
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.segment.generic.table.SimpleTableSegment;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 
 import java.util.Collection;
-import java.util.LinkedList;
 
 /**
  * Lock statement.
  */
+@RequiredArgsConstructor
 @Getter
-public class LockStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class LockStatement extends AbstractSQLStatement implements 
TCLStatement {
     
-    private final Collection<SimpleTableSegment> tables = new LinkedList<>();
+    private final Collection<SimpleTableSegment> tables;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/PrepareTransactionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/PrepareTransactionStatement.java
index 3c809f56890..485b7214329 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/PrepareTransactionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/PrepareTransactionStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Prepare transaction statement.
  */
-public class PrepareTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
+public final class PrepareTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/ReleaseSavepointStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/ReleaseSavepointStatement.java
index b769e2a28a6..873ca39338d 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/ReleaseSavepointStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/ReleaseSavepointStatement.java
@@ -18,15 +18,15 @@
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
 import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 
 /**
  * Release savepoint statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public class ReleaseSavepointStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class ReleaseSavepointStatement extends AbstractSQLStatement 
implements TCLStatement {
     
-    private String savepointName;
+    private final String savepointName;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackPreparedStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackPreparedStatement.java
index aaf1573a765..ba7b9e48e1b 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackPreparedStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackPreparedStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Rollback prepared statement.
  */
-public class RollbackPreparedStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class RollbackPreparedStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackStatement.java
index d1d805f355f..bf94155fa6c 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/RollbackStatement.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 
 import java.util.Optional;
@@ -26,11 +25,14 @@ import java.util.Optional;
 /**
  * Rollback statement.
  */
-@Getter
-@Setter
-public class RollbackStatement extends AbstractSQLStatement implements 
TCLStatement {
+@RequiredArgsConstructor
+public final class RollbackStatement extends AbstractSQLStatement implements 
TCLStatement {
     
-    private String savepointName;
+    private final String savepointName;
+    
+    public RollbackStatement() {
+        this(null);
+    }
     
     /**
      * Get save point name.
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SavepointStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SavepointStatement.java
index 8d39ab8f4ad..c98c0a7cdfe 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SavepointStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SavepointStatement.java
@@ -18,15 +18,15 @@
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
 import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 
 /**
  * Savepoint statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public class SavepointStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class SavepointStatement extends AbstractSQLStatement implements 
TCLStatement {
     
-    private String savepointName;
+    private final String savepointName;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetAutoCommitStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetAutoCommitStatement.java
index 674f2292a11..e45ca2ed3b5 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetAutoCommitStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetAutoCommitStatement.java
@@ -18,15 +18,15 @@
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
 import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQLStatement;
 
 /**
  * Set auto commit statement.
  */
+@RequiredArgsConstructor
 @Getter
-@Setter
-public class SetAutoCommitStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class SetAutoCommitStatement extends AbstractSQLStatement 
implements TCLStatement {
     
-    private boolean autoCommit;
+    private final boolean autoCommit;
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetConstraintsStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetConstraintsStatement.java
index 49d468f884a..40990180e06 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetConstraintsStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetConstraintsStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Set constraints statement.
  */
-public class SetConstraintsStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class SetConstraintsStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetTransactionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetTransactionStatement.java
index d4609d4a2dd..4aea0f5ec84 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetTransactionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/SetTransactionStatement.java
@@ -17,8 +17,7 @@
 
 package org.apache.shardingsphere.sql.parser.statement.core.statement.tcl;
 
-import lombok.Getter;
-import lombok.Setter;
+import lombok.RequiredArgsConstructor;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.OperationScope;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionAccessType;
 import 
org.apache.shardingsphere.sql.parser.statement.core.enums.TransactionIsolationLevel;
@@ -29,31 +28,54 @@ import java.util.Optional;
 /**
  * Set transaction statement.
  */
-@Getter
-@Setter
-public class SetTransactionStatement extends AbstractSQLStatement implements 
TCLStatement {
+@RequiredArgsConstructor
+public final class SetTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
     
-    private TransactionIsolationLevel isolationLevel;
+    private final OperationScope scope;
     
-    private OperationScope scope;
+    private final TransactionIsolationLevel isolationLevel;
     
-    private TransactionAccessType accessMode;
+    private final TransactionAccessType accessMode;
+    
+    public SetTransactionStatement() {
+        this(null, null, null);
+    }
+    
+    /**
+     *  Whether to contain transaction scope.
+     *
+     * @return contains transaction scope or not
+     */
+    public boolean containsScope() {
+        return null != scope;
+    }
+    
+    /**
+     * Whether is desired transaction scope.
+     *
+     * @param scope desired transaction scope
+     * @return is desired transaction scope or not
+     */
+    public boolean isDesiredScope(final OperationScope scope) {
+        return this.scope == scope;
+    }
     
     /**
-     * Get isolation level.
+     * Get transaction isolation level.
      *
-     * @return isolation level
+     * @return transaction isolation level
      */
     public Optional<TransactionIsolationLevel> getIsolationLevel() {
         return Optional.ofNullable(isolationLevel);
     }
     
     /**
-     * Get access mode.
+     * Whether is desired transaction access mode.
      *
-     * @return access mode 
+     * @param accessMode desired transaction access mode
+     * @return is desired transaction access mode or not
      */
-    public Optional<TransactionAccessType> getAccessMode() {
-        return Optional.ofNullable(accessMode);
+    public boolean isDesiredAccessMode(final TransactionAccessType accessMode) 
{
+        return this.accessMode == accessMode;
     }
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/StartTransactionStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/StartTransactionStatement.java
index 7d642d0b58c..ab891862860 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/StartTransactionStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/StartTransactionStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Start transaction statement.
  */
-public class StartTransactionStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class StartTransactionStatement extends AbstractSQLStatement 
implements TCLStatement {
 }
diff --git 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/UnlockStatement.java
 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/UnlockStatement.java
index f8797a837bc..5af9eccd1db 100644
--- 
a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/UnlockStatement.java
+++ 
b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/statement/tcl/UnlockStatement.java
@@ -22,5 +22,5 @@ import 
org.apache.shardingsphere.sql.parser.statement.core.statement.AbstractSQL
 /**
  * Unlock statement.
  */
-public class UnlockStatement extends AbstractSQLStatement implements 
TCLStatement {
+public final class UnlockStatement extends AbstractSQLStatement implements 
TCLStatement {
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java
index 9a5727491d9..72e2e4829bd 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/SetTransactionHandler.java
@@ -45,19 +45,16 @@ public final class SetTransactionHandler implements 
ProxyBackendHandler {
     
     @Override
     public ResponseHeader execute() {
-        ShardingSpherePreconditions.checkState(null != sqlStatement.getScope() 
|| !connectionSession.getTransactionStatus().isInTransaction(), 
SwitchTypeInTransactionException::new);
+        ShardingSpherePreconditions.checkState(sqlStatement.containsScope() || 
!connectionSession.getTransactionStatus().isInTransaction(), 
SwitchTypeInTransactionException::new);
         setReadOnly();
         setTransactionIsolationLevel();
         return new UpdateResponseHeader(sqlStatement);
     }
     
     private void setReadOnly() {
-        if (!sqlStatement.getAccessMode().isPresent()) {
-            return;
-        }
-        if (TransactionAccessType.READ_ONLY == 
sqlStatement.getAccessMode().get()) {
+        if (sqlStatement.isDesiredAccessMode(TransactionAccessType.READ_ONLY)) 
{
             connectionSession.setReadOnly(true);
-        } else if (TransactionAccessType.READ_WRITE == 
sqlStatement.getAccessMode().get()) {
+        } else if 
(sqlStatement.isDesiredAccessMode(TransactionAccessType.READ_WRITE)) {
             connectionSession.setReadOnly(false);
         }
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandlerFactory.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandlerFactory.java
index affb36eddba..977db9c488a 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandlerFactory.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/tcl/TCLBackendHandlerFactory.java
@@ -77,7 +77,7 @@ public final class TCLBackendHandlerFactory {
                     ? new TCLBackendHandler(tclStatement, 
TransactionOperationType.ROLLBACK_TO_SAVEPOINT, connectionSession)
                     : new TCLBackendHandler(tclStatement, 
TransactionOperationType.ROLLBACK, connectionSession);
         }
-        if (tclStatement instanceof SetTransactionStatement && 
OperationScope.GLOBAL != ((SetTransactionStatement) tclStatement).getScope()) {
+        if (tclStatement instanceof SetTransactionStatement && 
!((SetTransactionStatement) 
tclStatement).isDesiredScope(OperationScope.GLOBAL)) {
             return new SetTransactionHandler((SetTransactionStatement) 
tclStatement, connectionSession, sqlStatementContext.getDatabaseType());
         }
         if (tclStatement instanceof XAStatement) {

Reply via email to