未验证 提交 ba32bf80 编写于 作者: L Liang Zhang 提交者: GitHub

Merge pull request #2358 from cherrylzhao/dev-upstream

for #2356 support transaction for python mysql connector.
......@@ -37,7 +37,9 @@ import org.apache.shardingsphere.shardingproxy.backend.text.transaction.Transact
import org.apache.shardingsphere.transaction.core.TransactionOperationType;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Text protocol backend handler factory.
......@@ -47,7 +49,7 @@ import java.util.List;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TextProtocolBackendHandlerFactory {
private static final String SET_AUTOCOMMIT_1 = "SET AUTOCOMMIT=1";
private static final Set<String> AUTO_COMMIT = new HashSet<>(Arrays.asList("SET AUTOCOMMIT=1", "SET @@SESSION.AUTOCOMMIT = ON"));
private static final List<String> GUI_SQL = Arrays.asList("SET", "SHOW VARIABLES LIKE", "SHOW CHARACTER SET", "SHOW COLLATION");
......@@ -67,7 +69,7 @@ public final class TextProtocolBackendHandlerFactory {
if (transactionOperationType.isPresent()) {
return new TransactionBackendHandler(transactionOperationType.get(), backendConnection);
}
if (sql.toUpperCase().contains(SET_AUTOCOMMIT_1)) {
if (AUTO_COMMIT.contains(sql.toUpperCase())) {
return backendConnection.getStateHandler().isInTransaction() ? new TransactionBackendHandler(TransactionOperationType.COMMIT, backendConnection) : new SkipBackendHandler();
}
SQLStatement sqlStatement = new SQLJudgeEngine(sql).judge();
......
......@@ -60,20 +60,32 @@ public final class TextProtocolBackendHandlerFactoryTest {
}
@Test
public void assertNewInstance() {
public void assertNewTransactionInstance() {
String sql = "BEGIN";
TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
sql = "START TRANSACTION";
actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
sql = "SET AUTOCOMMIT=0";
actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
sql = "SET @@SESSION.AUTOCOMMIT = OFF";
actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
}
@Test
public void assertNewTransactionBackendHandlerInstanceOfCommitOperate() {
String sql = "SET AUTOCOMMIT=1";
ConnectionStateHandler stateHandler = mock(ConnectionStateHandler.class);
when(backendConnection.getStateHandler()).thenReturn(stateHandler);
when(stateHandler.isInTransaction()).thenReturn(true);
String sql = "SET AUTOCOMMIT=1";
TextProtocolBackendHandler actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
sql = "SET @@SESSION.AUTOCOMMIT = ON";
actual = TextProtocolBackendHandlerFactory.newInstance(sql, backendConnection);
assertThat(actual, instanceOf(TransactionBackendHandler.class));
}
@Test
......
......@@ -31,7 +31,7 @@ public enum TransactionOperationType {
/**
* Get operation type.
*
*
* @param sql SQL
* @return transaction operation type
*/
......@@ -41,6 +41,7 @@ public enum TransactionOperationType {
case "BEGIN":
case "START TRANSACTION":
case "SET AUTOCOMMIT=0":
case "SET @@SESSION.AUTOCOMMIT = OFF":
return Optional.of(TransactionOperationType.BEGIN);
case "COMMIT":
return Optional.of(TransactionOperationType.COMMIT);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册