diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnection.java b/src/main/java/org/mariadb/r2dbc/MariadbConnection.java index b0de3b5f..2a2b1e45 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnection.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnection.java @@ -26,15 +26,11 @@ public final class MariadbConnection implements org.mariadb.r2dbc.api.MariadbCon private final Logger logger = Loggers.getLogger(this.getClass()); private final Client client; private final MariadbConnectionConfiguration configuration; - private volatile IsolationLevel sessionIsolationLevel; - private volatile IsolationLevel isolationLevel; private volatile String database; public MariadbConnection( - Client client, IsolationLevel isolationLevel, MariadbConnectionConfiguration configuration) { + Client client, MariadbConnectionConfiguration configuration) { this.client = Assert.requireNonNull(client, "client must not be null"); - this.sessionIsolationLevel = - Assert.requireNonNull(isolationLevel, "isolationLevel must not be null"); this.configuration = Assert.requireNonNull(configuration, "configuration must not be null"); this.database = configuration.getDatabase(); } @@ -48,19 +44,6 @@ public Mono beginTransaction() { public Mono beginTransaction(TransactionDefinition definition) { Mono request = Mono.empty(); - // set isolation level for next transaction if set - IsolationLevel isoLevel = definition.getAttribute(TransactionDefinition.ISOLATION_LEVEL); - if (isoLevel != null && !isoLevel.equals(getTransactionIsolationLevel())) { - String sql = String.format("SET TRANSACTION ISOLATION LEVEL %s", isoLevel.asSql()); - ExceptionFactory exceptionFactory = ExceptionFactory.withSql(sql); - request = - client - .sendCommand(new QueryPacket(sql), true) - .handle(exceptionFactory::handleErrorResponse) - .then() - .doOnSuccess(ignore -> this.isolationLevel = isoLevel); - } - return request.then(this.client.beginTransaction(definition)); } @@ -71,7 +54,7 @@ public Mono close() { @Override public Mono commitTransaction() { - return this.client.commitTransaction().doOnSuccess(i -> this.isolationLevel = null); + return this.client.commitTransaction(); } @Override @@ -105,11 +88,7 @@ public MariadbConnectionMetadata getMetadata() { @Override public IsolationLevel getTransactionIsolationLevel() { - if (isolationLevel != null) return isolationLevel; - if ((client.getContext().getClientCapabilities() & Capabilities.CLIENT_SESSION_TRACK) > 0 - && client.getContext().getIsolationLevel() != null) - return client.getContext().getIsolationLevel(); - return this.sessionIsolationLevel; + return IsolationLevel.READ_COMMITTED; } @Override @@ -149,7 +128,7 @@ public int getPort() { @Override public Mono rollbackTransaction() { - return this.client.rollbackTransaction().then().doOnSuccess(i -> this.isolationLevel = null); + return this.client.rollbackTransaction().then(); } @Override @@ -161,8 +140,7 @@ public Mono rollbackTransactionToSavepoint(String name) { public Mono setAutoCommit(boolean autoCommit) { return client .setAutoCommit(autoCommit) - .then() - .doOnSuccess(i -> this.isolationLevel = autoCommit ? null : this.isolationLevel); + .then(); } @Override @@ -208,31 +186,18 @@ public Mono setStatementTimeout(Duration timeout) { @Override public Mono setTransactionIsolationLevel(IsolationLevel isolationLevel) { Assert.requireNonNull(isolationLevel, "isolationLevel must not be null"); + if (isolationLevel != IsolationLevel.READ_COMMITTED) { + throw new IllegalArgumentException( + "SingleStore supports only the READ_COMMITTED isolation level"); + } - if ((client.getContext().getClientCapabilities() & Capabilities.CLIENT_SESSION_TRACK) > 0 - && client.getContext().getIsolationLevel() != null - && client.getContext().getIsolationLevel().equals(isolationLevel)) return Mono.empty(); - - String sql = - String.format("SET SESSION TRANSACTION ISOLATION LEVEL %s", isolationLevel.asSql()); - ExceptionFactory exceptionFactory = ExceptionFactory.withSql(sql); - final IsolationLevel newIsolation = isolationLevel; - return client - .sendCommand(new QueryPacket(sql), true) - .handle(exceptionFactory::handleErrorResponse) - .then() - .doOnSuccess(ignore -> this.sessionIsolationLevel = newIsolation); + return Mono.empty(); } @Override public String toString() { return "MariadbConnection{client=" + client - + ", isolationLevel=" - + ((client.getContext().getClientCapabilities() | Capabilities.CLIENT_SESSION_TRACK) > 0 - && client.getContext().getIsolationLevel() != null - ? client.getContext().getIsolationLevel() - : sessionIsolationLevel) + '}'; } diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java b/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java index a30a5664..c379b378 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnectionConfiguration.java @@ -7,7 +7,6 @@ import io.netty.handler.ssl.SslContextBuilder; import io.r2dbc.spi.ConnectionFactoryOptions; -import io.r2dbc.spi.IsolationLevel; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.net.URLDecoder; @@ -55,7 +54,6 @@ public final class MariadbConnectionConfiguration { private final String[] restrictedAuth; private final LoopResources loopResources; private final UnaryOperator sslContextBuilderCustomizer; - private IsolationLevel isolationLevel; private final boolean skipPostCommands; private MariadbConnectionConfiguration( @@ -86,7 +84,6 @@ private MariadbConnectionConfiguration( @Nullable String cachingRsaPublicKey, boolean allowPublicKeyRetrieval, boolean useServerPrepStmts, - IsolationLevel isolationLevel, Boolean autocommit, boolean permitRedirect, boolean skipPostCommands, @@ -103,7 +100,6 @@ private MariadbConnectionConfiguration( this.tcpAbortiveClose = tcpAbortiveClose == null ? Boolean.FALSE : tcpAbortiveClose; this.transactionReplay = transactionReplay == null ? Boolean.FALSE : transactionReplay; this.database = database != null && !database.isEmpty() ? database : null; - this.isolationLevel = isolationLevel; this.restrictedAuth = restrictedAuth != null ? restrictedAuth.split(",") : null; if (hostAddresses != null) { this.hostAddresses = hostAddresses; @@ -362,13 +358,6 @@ public static Builder fromOptions(ConnectionFactoryOptions connectionFactoryOpti connectionFactoryOptions.getValue( MariadbConnectionFactoryProvider.USE_SERVER_PREPARE))); } - if (connectionFactoryOptions.hasOption(MariadbConnectionFactoryProvider.ISOLATION_LEVEL)) { - String isolationLvl = - (String) - connectionFactoryOptions.getValue(MariadbConnectionFactoryProvider.ISOLATION_LEVEL); - builder.isolationLevel( - isolationLvl == null ? null : IsolationLevel.valueOf(isolationLvl.replace("-", " "))); - } if (connectionFactoryOptions.hasOption(MariadbConnectionFactoryProvider.AUTO_COMMIT)) { Object value = @@ -517,14 +506,6 @@ public static Builder builder() { return new Builder(); } - public IsolationLevel getIsolationLevel() { - return isolationLevel; - } - - private void setIsolationLevel(IsolationLevel isolationLevel) { - this.isolationLevel = isolationLevel; - } - @Nullable public Duration getConnectTimeout() { return this.connectTimeout; @@ -766,14 +747,6 @@ public String toString() { sb.append(field.getName()).append('='); sb.append(obj); } - } else if (field.getType().equals(IsolationLevel.class)) { - Object defaultValue = field.get(defaultConf); - if (!obj.equals(defaultValue)) { - sb.append(first ? '?' : '&'); - first = false; - sb.append("isolationLevel="); - sb.append(((IsolationLevel) obj).asSql().replace(" ", "-")); - } } else if (field.getType().equals(Map.class)) { Object defaultValue = field.get(defaultConf); if (!obj.equals(defaultValue)) { @@ -840,7 +813,6 @@ public static final class Builder implements Cloneable { private boolean allowMultiQueries = false; private boolean allowPipelining = true; private boolean useServerPrepStmts = false; - private IsolationLevel isolationLevel = null; private Boolean autocommit = Boolean.TRUE; private boolean permitRedirect = true; private boolean skipPostCommands = false; @@ -911,7 +883,6 @@ private MariadbConnectionConfiguration build(boolean checkMandatory) { this.cachingRsaPublicKey, this.allowPublicKeyRetrieval, this.useServerPrepStmts, - this.isolationLevel, this.autocommit, this.permitRedirect, this.skipPostCommands, @@ -1184,17 +1155,6 @@ public Builder useServerPrepStmts(boolean useServerPrepStmts) { return this; } - /** - * Permit to set default isolation level - * - * @param isolationLevel transaction isolation level - * @return this {@link Builder} - */ - public Builder isolationLevel(IsolationLevel isolationLevel) { - this.isolationLevel = isolationLevel; - return this; - } - /** * Permit to indicate default autocommit value. Default value True. * @@ -1227,7 +1187,6 @@ public Builder permitRedirect(boolean permitRedirect) { *
    *
  • connection exchanges to be UT8(mb3/mb4) *
  • autocommit set to true - *
  • transaction isolation defaulting to REPEATABLE-READ *
* * Default value False. @@ -1385,8 +1344,6 @@ public String toString() { + ", timezone=" + timezone + ", prepareCacheSize=" - + isolationLevel - + ", isolationLevel=" + prepareCacheSize + ", tlsProtocol=" + tlsProtocol diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactory.java b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactory.java index 269f4fc4..8745678a 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactory.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactory.java @@ -156,23 +156,7 @@ public static Mono setSessionVariables( } // set default transaction isolation - String txIsolation = - (client.getVersion().isMariaDBServer() - && client.getVersion().versionGreaterOrEqual(11, 1, 1)) - || (!client.getVersion().isMariaDBServer() - && (client.getVersion().versionGreaterOrEqual(8, 0, 3) - || (client.getVersion().getMajorVersion() < 8 - && client.getVersion().versionGreaterOrEqual(5, 7, 20)))) - ? "transaction_isolation" - : "tx_isolation"; - sql.append(",") - .append(txIsolation) - .append("='") - .append( - configuration.getIsolationLevel() == null - ? "REPEATABLE-READ" - : configuration.getIsolationLevel().asSql().replace(" ", "-")) - .append("'"); + String txIsolation = "tx_isolation"; // set session tracking if ((client.getContext().getClientCapabilities() & Capabilities.CLIENT_SESSION_TRACK) > 0) { @@ -196,15 +180,6 @@ public static Mono setSessionVariables( .append(txIsolation) .append("')))"); } - - ; - - client - .getContext() - .setIsolationLevel( - configuration.getIsolationLevel() == null - ? IsolationLevel.REPEATABLE_READ - : configuration.getIsolationLevel()); } // set session variables if defined @@ -292,9 +267,6 @@ configuration, new DomainSocketAddress(configuration.getSocket()), null, lock) Mono.just( new MariadbConnection( client, - configuration.getIsolationLevel() == null - ? IsolationLevel.REPEATABLE_READ - : configuration.getIsolationLevel(), configuration)) .onErrorResume(throwable -> closeWithError(client, throwable))) .cast(org.mariadb.r2dbc.api.MariadbConnection.class); diff --git a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java index 18dd71e5..87f2519d 100644 --- a/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java +++ b/src/main/java/org/mariadb/r2dbc/MariadbConnectionFactoryProvider.java @@ -26,7 +26,6 @@ public final class MariadbConnectionFactoryProvider implements ConnectionFactory public static final Option ALLOW_PIPELINING = Option.valueOf("allowPipelining"); public static final Option USE_SERVER_PREPARE = Option.valueOf("useServerPrepStmts"); - public static final Option ISOLATION_LEVEL = Option.valueOf("isolationLevel"); public static final Option AUTO_COMMIT = Option.valueOf("autocommit"); public static final Option PERMIT_REDIRECT = Option.valueOf("permitRedirect"); public static final Option SKIP_POST_COMMANDS = Option.valueOf("skipPostCommands"); diff --git a/src/main/java/org/mariadb/r2dbc/MariadbTransactionDefinition.java b/src/main/java/org/mariadb/r2dbc/MariadbTransactionDefinition.java deleted file mode 100644 index c52be015..00000000 --- a/src/main/java/org/mariadb/r2dbc/MariadbTransactionDefinition.java +++ /dev/null @@ -1,76 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright (c) 2020-2024 MariaDB Corporation Ab - -package org.mariadb.r2dbc; - -import io.r2dbc.spi.IsolationLevel; -import io.r2dbc.spi.Option; -import io.r2dbc.spi.TransactionDefinition; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import org.mariadb.r2dbc.util.Assert; - -public final class MariadbTransactionDefinition implements TransactionDefinition { - - public static final MariadbTransactionDefinition EMPTY = - new MariadbTransactionDefinition(Collections.emptyMap()); - - public static final Option WITH_CONSISTENT_SNAPSHOT = - Option.valueOf("WITH CONSISTENT SNAPSHOT"); - public static MariadbTransactionDefinition WITH_CONSISTENT_SNAPSHOT_READ_WRITE = - EMPTY.consistent().readWrite(); - public static MariadbTransactionDefinition WITH_CONSISTENT_SNAPSHOT_READ_ONLY = - EMPTY.consistent().readOnly(); - public static MariadbTransactionDefinition READ_WRITE = EMPTY.readWrite(); - public static MariadbTransactionDefinition READ_ONLY = EMPTY.readOnly(); - private final Map, Object> options; - - private MariadbTransactionDefinition(Map, Object> options) { - this.options = options; - } - - static MariadbTransactionDefinition mutability(boolean readWrite) { - return readWrite ? EMPTY.readWrite() : EMPTY.readOnly(); - } - - static MariadbTransactionDefinition from(IsolationLevel isolationLevel) { - return MariadbTransactionDefinition.EMPTY.isolationLevel(isolationLevel); - } - - @Override - @SuppressWarnings("unchecked") - public T getAttribute(Option option) { - return (T) this.options.get(option); - } - - public MariadbTransactionDefinition with(Option option, Object value) { - - Map, Object> options = new HashMap<>(this.options); - options.put( - Assert.requireNonNull(option, "option must not be null"), - Assert.requireNonNull(value, "value must not be null")); - - return new MariadbTransactionDefinition(options); - } - - public MariadbTransactionDefinition isolationLevel(IsolationLevel isolationLevel) { - return with(TransactionDefinition.ISOLATION_LEVEL, isolationLevel); - } - - public MariadbTransactionDefinition readOnly() { - return with(TransactionDefinition.READ_ONLY, true); - } - - public MariadbTransactionDefinition readWrite() { - return with(TransactionDefinition.READ_ONLY, false); - } - - public MariadbTransactionDefinition consistent() { - return with(MariadbTransactionDefinition.WITH_CONSISTENT_SNAPSHOT, true); - } - - public MariadbTransactionDefinition notConsistent() { - return with(MariadbTransactionDefinition.WITH_CONSISTENT_SNAPSHOT, false); - } -} diff --git a/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java b/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java index f8e95962..7f25d387 100644 --- a/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java +++ b/src/main/java/org/mariadb/r2dbc/client/FailoverClient.java @@ -134,27 +134,10 @@ private static Mono syncNewState( .then(); } - // sync transaction isolation - Mono monoIsolationLevel; - if (currentClient.getContext().getIsolationLevel() == oldCtx.getIsolationLevel()) { - monoIsolationLevel = Mono.empty(); - } else if (oldCtx.getIsolationLevel() != null) { - String sql = - String.format( - "SET SESSION TRANSACTION ISOLATION LEVEL %s", oldCtx.getIsolationLevel().asSql()); - ExceptionFactory exceptionFactory = ExceptionFactory.withSql(sql); - monoIsolationLevel = - currentClient - .sendCommand(new QueryPacket(sql), true) - .handle(exceptionFactory::handleErrorResponse) - .then(); - } else monoIsolationLevel = Mono.empty(); - // sync autoCommit return currentClient .setAutoCommit(oldCli.isAutoCommit()) .then(monoDatabase) - .then(monoIsolationLevel) .then(); } diff --git a/src/main/java/org/mariadb/r2dbc/client/RedoContext.java b/src/main/java/org/mariadb/r2dbc/client/RedoContext.java index 8bf69516..0c07f5eb 100644 --- a/src/main/java/org/mariadb/r2dbc/client/RedoContext.java +++ b/src/main/java/org/mariadb/r2dbc/client/RedoContext.java @@ -5,7 +5,6 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import io.r2dbc.spi.IsolationLevel; import org.mariadb.r2dbc.message.ClientMessage; import org.mariadb.r2dbc.util.constants.ServerStatus; @@ -21,8 +20,7 @@ public RedoContext( boolean mariaDBServer, long clientCapabilities, String database, - ByteBufAllocator byteBufAllocator, - IsolationLevel isolationLevel) { + ByteBufAllocator byteBufAllocator) { super( serverVersion, threadId, @@ -31,8 +29,7 @@ public RedoContext( mariaDBServer, clientCapabilities, database, - byteBufAllocator, - isolationLevel); + byteBufAllocator); transactionSaver = new TransactionSaver(); } diff --git a/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java b/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java index 7788e26f..e07d8e90 100644 --- a/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java +++ b/src/main/java/org/mariadb/r2dbc/client/SimpleClient.java @@ -399,19 +399,7 @@ public Mono beginTransaction() { * @return publisher */ public Mono beginTransaction(TransactionDefinition definition) { - StringBuilder sb = new StringBuilder("START TRANSACTION"); - boolean first = true; - if (Boolean.TRUE.equals(definition.getAttribute(TransactionDefinition.READ_ONLY))) { - sb.append(" READ ONLY"); - first = false; - } - if (Boolean.TRUE.equals( - definition.getAttribute(MariadbTransactionDefinition.WITH_CONSISTENT_SNAPSHOT))) { - if (!first) sb.append(","); - sb.append(" WITH CONSISTENT SNAPSHOT"); - } - - return executeWhenNotInTransaction(sb.toString()); + return executeWhenNotInTransaction("BEGIN"); } /** @@ -534,8 +522,7 @@ public void setContext(InitialHandshakePacket handshake, long clientCapabilities handshake.isMariaDBServer(), clientCapabilities, configuration.getDatabase(), - byteBufAllocator, - configuration.getIsolationLevel()) + byteBufAllocator) : new SimpleContext( handshake.getServerVersion(), handshake.getThreadId(), @@ -544,8 +531,7 @@ public void setContext(InitialHandshakePacket handshake, long clientCapabilities handshake.isMariaDBServer(), clientCapabilities, configuration.getDatabase(), - byteBufAllocator, - configuration.getIsolationLevel()); + byteBufAllocator); decoder.setContext(context); encoder.setContext(context); } diff --git a/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java b/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java index e7e021f0..ae2ab546 100644 --- a/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java +++ b/src/main/java/org/mariadb/r2dbc/client/SimpleContext.java @@ -4,7 +4,6 @@ package org.mariadb.r2dbc.client; import io.netty.buffer.ByteBufAllocator; -import io.r2dbc.spi.IsolationLevel; import org.mariadb.r2dbc.message.Context; public class SimpleContext implements Context { @@ -16,7 +15,6 @@ public class SimpleContext implements Context { private final ByteBufAllocator byteBufAllocator; private String redirectValue; private short serverStatus; - private IsolationLevel isolationLevel; private String database; public SimpleContext( @@ -27,15 +25,13 @@ public SimpleContext( boolean mariaDBServer, long clientCapabilities, String database, - ByteBufAllocator byteBufAllocator, - IsolationLevel isolationLevel) { + ByteBufAllocator byteBufAllocator) { this.threadId = threadId; this.serverCapabilities = capabilities; this.clientCapabilities = clientCapabilities; this.serverStatus = serverStatus; this.version = new ServerVersion(serverVersion, mariaDBServer); - this.isolationLevel = isolationLevel; this.database = database; this.byteBufAllocator = byteBufAllocator; this.redirectValue = null; @@ -69,14 +65,6 @@ public void setDatabase(String database) { this.database = database; } - public IsolationLevel getIsolationLevel() { - return isolationLevel; - } - - public void setIsolationLevel(IsolationLevel isolationLevel) { - this.isolationLevel = isolationLevel; - } - public ServerVersion getVersion() { return version; } diff --git a/src/main/java/org/mariadb/r2dbc/message/Context.java b/src/main/java/org/mariadb/r2dbc/message/Context.java index 3fc83b9f..6782b884 100644 --- a/src/main/java/org/mariadb/r2dbc/message/Context.java +++ b/src/main/java/org/mariadb/r2dbc/message/Context.java @@ -5,7 +5,6 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import io.r2dbc.spi.IsolationLevel; import org.mariadb.r2dbc.client.ServerVersion; public interface Context { @@ -20,10 +19,6 @@ public interface Context { void setServerStatus(short serverStatus); - IsolationLevel getIsolationLevel(); - - void setIsolationLevel(IsolationLevel isolationLevel); - void setRedirect(String redirectValue); String getRedirectValue(); diff --git a/src/main/java/org/mariadb/r2dbc/message/server/OkPacket.java b/src/main/java/org/mariadb/r2dbc/message/server/OkPacket.java index 35f403f6..b56c73c2 100644 --- a/src/main/java/org/mariadb/r2dbc/message/server/OkPacket.java +++ b/src/main/java/org/mariadb/r2dbc/message/server/OkPacket.java @@ -4,7 +4,6 @@ package org.mariadb.r2dbc.message.server; import io.netty.buffer.ByteBuf; -import io.r2dbc.spi.IsolationLevel; import io.r2dbc.spi.Result; import org.mariadb.r2dbc.message.Context; import org.mariadb.r2dbc.message.ServerMessage; @@ -60,32 +59,9 @@ public static OkPacket decode(ByteBuf buf, Context context) { String value = BufferUtils.readLengthEncodedString(sessionVariableBuf); logger.debug("System variable change : {} = {}", variable, value); - switch (variable) { - case "transaction_isolation": - case "tx_isolation": - switch (value) { - case "REPEATABLE-READ": - context.setIsolationLevel(IsolationLevel.REPEATABLE_READ); - break; - - case "READ-UNCOMMITTED": - context.setIsolationLevel(IsolationLevel.READ_UNCOMMITTED); - break; - - case "SERIALIZABLE": - context.setIsolationLevel(IsolationLevel.SERIALIZABLE); - break; - - default: - context.setIsolationLevel(IsolationLevel.READ_COMMITTED); - break; - } - break; - - case "redirect_url": - context.setRedirect(value.isEmpty() ? null : value); - break; - } + if (variable.equals("redirect_url")) { + context.setRedirect(value.isEmpty() ? null : value); + } } while (sessionVariableBuf.readableBytes() > 0); break; diff --git a/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java b/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java index 2840965d..86ede551 100644 --- a/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java +++ b/src/test/java/org/mariadb/r2dbc/integration/ConfigurationTest.java @@ -65,33 +65,19 @@ void ensureUserInfoUrlEncoding() { .contains("r2dbc:mariadb://localhost:3305/шdb?password=***&username=root@å")); } - @Test - void isolationLevel() { - MariadbConnectionFactory factory = - (MariadbConnectionFactory) - ConnectionFactories.get( - "r2dbc:mariadb://root:password@localhost:3305/db?isolationLevel=REPEATABLE-READ"); - Assertions.assertTrue( - factory - .toString() - .contains( - "r2dbc:mariadb://localhost:3305/db?password=***&username=root&isolationLevel=REPEATABLE-READ")); - } - @Test void haMode() { MariadbConnectionFactory factory = (MariadbConnectionFactory) ConnectionFactories.get( - "r2dbc:mariadb:loadbalance://root:password@localhost:3305/db?isolationLevel=REPEATABLE-READ"); + "r2dbc:mariadb:loadbalance://root:password@localhost:3305/db"); Assertions.assertTrue(factory.toString().contains("username=root")); - Assertions.assertTrue(factory.toString().contains("/db?")); - Assertions.assertTrue(factory.toString().contains("isolationLevel=REPEATABLE-READ")); + Assertions.assertTrue(factory.toString().contains("/db")); assertThrows( Exception.class, () -> ConnectionFactories.get( - "r2dbc:mariadb:failover://root:password@localhost:3305/db?isolationLevel=REPEATABLE-READ"), + "r2dbc:mariadb:failover://root:password@localhost:3305/db"), "Wrong argument value 'failover' for HaMode"); } @@ -369,7 +355,7 @@ void confStringValue() { + " host=localhost, sessionVariables=null, connectionAttributes=null, password=*," + " restrictedAuth=null, port=3306, hosts={}, socket=null, allowMultiQueries=false," + " allowPipelining=true, useServerPrepStmts=false, timezone=null," - + " prepareCacheSize=null, isolationLevel=null, tlsProtocol=null, serverSslCert=null," + + " prepareCacheSize=null, tlsProtocol=null, serverSslCert=null," + " clientSslCert=null, clientSslKey=null, clientSslPassword=null, sslMode=TRUST," + " sslTunnelDisableHostVerification=false, pamOtherPwd=*,*, tinyInt1isBit=false," + " autoCommit=true, permitRedirect=true}", @@ -382,7 +368,7 @@ void confStringValue() { + " host=localhost, sessionVariables=null, connectionAttributes=null, password=*," + " restrictedAuth=null, port=3306, hosts={}, socket=null, allowMultiQueries=false," + " allowPipelining=true, useServerPrepStmts=false, timezone=null," - + " prepareCacheSize=null, isolationLevel=null, tlsProtocol=null, serverSslCert=null," + + " prepareCacheSize=null, tlsProtocol=null, serverSslCert=null," + " clientSslCert=null, clientSslKey=null, clientSslPassword=null, sslMode=TRUST," + " sslTunnelDisableHostVerification=false, pamOtherPwd=*,*, tinyInt1isBit=false," + " autoCommit=true, permitRedirect=true}", diff --git a/src/test/java/org/mariadb/r2dbc/integration/ConnectionTest.java b/src/test/java/org/mariadb/r2dbc/integration/ConnectionTest.java index f15001ab..2933f2b6 100644 --- a/src/test/java/org/mariadb/r2dbc/integration/ConnectionTest.java +++ b/src/test/java/org/mariadb/r2dbc/integration/ConnectionTest.java @@ -23,13 +23,6 @@ import reactor.test.StepVerifier; public class ConnectionTest extends BaseConnectionTest { - IsolationLevel[] levels = - new IsolationLevel[] { - IsolationLevel.READ_UNCOMMITTED, - IsolationLevel.READ_COMMITTED, - IsolationLevel.SERIALIZABLE, - IsolationLevel.REPEATABLE_READ - }; @BeforeAll public static void before2() { @@ -453,72 +446,6 @@ void multipleBegin(MariadbConnection con) throws Exception { con.rollbackTransaction().block(); } - @Test - @Disabled // TODO: PLAT-7665 - void multipleBeginWithIsolation() throws Exception { - MariadbTransactionDefinition[] transactionDefinitions = { - MariadbTransactionDefinition.READ_ONLY, - MariadbTransactionDefinition.READ_WRITE, - MariadbTransactionDefinition.EMPTY, - MariadbTransactionDefinition.WITH_CONSISTENT_SNAPSHOT_READ_ONLY, - MariadbTransactionDefinition.WITH_CONSISTENT_SNAPSHOT_READ_WRITE - }; - - for (MariadbTransactionDefinition transactionDefinition : transactionDefinitions) { - MariadbConnection connection = factory.create().block(); - assert connection != null; - multipleBeginWithIsolation(connection, transactionDefinition); - connection.close().block(); - - connection = - new MariadbConnectionFactory( - TestConfiguration.defaultBuilder.clone().allowPipelining(false).build()) - .create() - .block(); - assert connection != null; - multipleBeginWithIsolation(connection, transactionDefinition); - connection.close().block(); - } - } - - void multipleBeginWithIsolation( - MariadbConnection con, MariadbTransactionDefinition transactionDefinition) throws Exception { - con.beginTransaction(transactionDefinition).subscribe(); - con.beginTransaction(transactionDefinition).block(); - con.beginTransaction(transactionDefinition).block(); - con.rollbackTransaction().block(); - } - - @Test - @Disabled // TODO: PLAT-7665 - void beginTransactionWithIsolation() throws Exception { - Assumptions.assumeTrue(!isEnterprise() && !minVersion(10, 2, 0)); - TransactionDefinition transactionDefinition = - MariadbTransactionDefinition.READ_ONLY.isolationLevel(IsolationLevel.READ_COMMITTED); - TransactionDefinition transactionDefinition2 = - MariadbTransactionDefinition.READ_ONLY.isolationLevel(IsolationLevel.REPEATABLE_READ); - assertFalse(sharedConn.isInTransaction()); - - sharedConn.beginTransaction(transactionDefinition).block(); - assertEquals(IsolationLevel.READ_COMMITTED, sharedConn.getTransactionIsolationLevel()); - assertTrue(sharedConn.isInTransaction()); - assertTrue(sharedConn.isInReadOnlyTransaction()); - sharedConn.beginTransaction(transactionDefinition).block(); - sharedConn - .beginTransaction(transactionDefinition2) - .as(StepVerifier::create) - .expectErrorMatches( - throwable -> - throwable instanceof R2dbcPermissionDeniedException - && throwable - .getMessage() - .equals( - "Transaction characteristics can't be changed while a transaction is" - + " in progress")) - .verify(); - sharedConn.rollbackTransaction().block(); - } - @Test void multipleAutocommit() throws Exception { MariadbConnection connection = factory.create().block(); @@ -674,12 +601,12 @@ void getTransactionIsolationLevel() { MariadbConnection connection = new MariadbConnectionFactory(TestConfiguration.defaultBuilder.build()).create().block(); try { - IsolationLevel defaultValue = IsolationLevel.REPEATABLE_READ; + IsolationLevel defaultValue = IsolationLevel.READ_COMMITTED; Assertions.assertEquals(defaultValue, connection.getTransactionIsolationLevel()); - connection.setTransactionIsolationLevel(IsolationLevel.READ_UNCOMMITTED).block(); + connection.setTransactionIsolationLevel(IsolationLevel.READ_COMMITTED).block(); connection.createStatement("BEGIN").execute().blockLast(); Assertions.assertEquals( - IsolationLevel.READ_UNCOMMITTED, connection.getTransactionIsolationLevel()); + IsolationLevel.READ_COMMITTED, connection.getTransactionIsolationLevel()); connection.setTransactionIsolationLevel(defaultValue).block(); } finally { connection.close().block(); @@ -815,13 +742,6 @@ void toStringTest() { .contains( "MariadbConnection{client=Client{isClosed=false, " + "context=ConnectionContext{")); - if (!"skysql".equals(System.getenv("srv")) && !"skysql-ha".equals(System.getenv("srv"))) { - Assertions.assertTrue( - connection - .toString() - .contains(", isolationLevel=IsolationLevel{sql='REPEATABLE READ'}}"), - connection.toString()); - } } finally { connection.close().block(); } @@ -834,14 +754,11 @@ public void isolationLevel() { Assertions.assertThrows( Exception.class, () -> connection.setTransactionIsolationLevel(null).block()); - for (IsolationLevel level : levels) { - System.out.println(level); - connection.setTransactionIsolationLevel(level).block(); - assertEquals(level, connection.getTransactionIsolationLevel()); - } + connection.setTransactionIsolationLevel(IsolationLevel.READ_COMMITTED).block(); + assertEquals(IsolationLevel.READ_COMMITTED, connection.getTransactionIsolationLevel()); connection.close().block(); Assertions.assertThrows( - R2dbcNonTransientResourceException.class, + java.lang.IllegalArgumentException.class, () -> connection.setTransactionIsolationLevel(IsolationLevel.READ_UNCOMMITTED).block()); } @@ -865,51 +782,6 @@ public void noDb() throws Throwable { } } - @Test - public void initialIsolationLevel() throws CloneNotSupportedException { - Assumptions.assumeTrue( - !"skysql".equals(System.getenv("srv")) && !"skysql-ha".equals(System.getenv("srv"))); - for (IsolationLevel level : levels) { - sharedConn - .createStatement("SET GLOBAL TRANSACTION ISOLATION LEVEL " + level.asSql()) - .execute() - .blockLast(); - MariadbConnection connection = - new MariadbConnectionFactory(TestConfiguration.defaultBuilder.build()).create().block(); - assertEquals(IsolationLevel.REPEATABLE_READ, connection.getTransactionIsolationLevel()); - connection.close().block(); - - connection = - new MariadbConnectionFactory( - TestConfiguration.defaultBuilder.clone().isolationLevel(level).build()) - .create() - .block(); - assertEquals(level, connection.getTransactionIsolationLevel()); - String sql = "SELECT @@tx_isolation"; - - if (!isMariaDBServer()) { - if ((minVersion(8, 0, 3)) - || (sharedConn.getMetadata().getMajorVersion() < 8 && minVersion(5, 7, 20))) { - sql = "SELECT @@transaction_isolation"; - } - } - - String iso = - connection - .createStatement(sql) - .execute() - .flatMap(it -> it.map((row, rowMetadata) -> row.get(0, String.class))) - .blockFirst(); - assertEquals(level, IsolationLevel.valueOf(iso.replace("-", " "))); - connection.close().block(); - } - - sharedConn - .createStatement( - "SET GLOBAL TRANSACTION ISOLATION LEVEL " + IsolationLevel.REPEATABLE_READ.asSql()) - .execute() - .blockLast(); - } @Test public void errorOnConnection() throws Throwable { diff --git a/src/test/java/org/mariadb/r2dbc/integration/LoggingTest.java b/src/test/java/org/mariadb/r2dbc/integration/LoggingTest.java index f04b66f7..69631de2 100644 --- a/src/test/java/org/mariadb/r2dbc/integration/LoggingTest.java +++ b/src/test/java/org/mariadb/r2dbc/integration/LoggingTest.java @@ -72,12 +72,10 @@ void basicLogging() throws IOException { " +-------------------------------------------------+\n" + " | 0 1 2 3 4 5 6 7 8 9 a b c d e f |\n" + "+--------+-------------------------------------------------+----------------+\n" + - "|00000000| 48 00 00 00 03 53 45 54 20 20 6e 61 6d 65 73 20 |H....SET names |\n" + + "|00000000| 20 00 00 00 03 53 45 54 20 20 6e 61 6d 65 73 20 | ....SET names |\n" + "|00000010| 55 54 46 38 4d 42 34 2c 61 75 74 6f 63 6f 6d 6d |UTF8MB4,autocomm|\n" + - "|00000020| 69 74 3d 31 2c 74 72 61 6e 73 61 63 74 69 6f 6e |it=1,transaction|\n" + - "|00000030| 5f 69 73 6f 6c 61 74 69 6f 6e 3d 27 52 45 50 45 |_isolation='REPE|\n" + - "|00000040| 41 54 41 42 4c 45 2d 52 45 41 44 27 |ATABLE-READ' |\n" + - "+--------+-------------------------------------------------+----------------+\n"; + "|00000020| 69 74 3d 31 |it=1 |\n" + + "+--------+-------------------------------------------------+----------------+"; Assertions.assertTrue( contents.contains(selectIsolation) || contents.contains(selectIsolation.replace("\r\n", "\n")), diff --git a/src/test/java/org/mariadb/r2dbc/unit/MariadbConnectionConfigurationTest.java b/src/test/java/org/mariadb/r2dbc/unit/MariadbConnectionConfigurationTest.java index 35ec2327..ed5a14c8 100644 --- a/src/test/java/org/mariadb/r2dbc/unit/MariadbConnectionConfigurationTest.java +++ b/src/test/java/org/mariadb/r2dbc/unit/MariadbConnectionConfigurationTest.java @@ -4,7 +4,6 @@ package org.mariadb.r2dbc.unit; import io.r2dbc.spi.ConnectionFactoryOptions; -import io.r2dbc.spi.IsolationLevel; import java.time.Duration; import java.util.HashMap; import java.util.Map; @@ -47,7 +46,6 @@ public void builder() { .cachingRsaPublicKey("cachingRSAPublicKey") .allowPublicKeyRetrieval(true) .useServerPrepStmts(true) - .isolationLevel(IsolationLevel.SERIALIZABLE) .autocommit(false) .tinyInt1isBit(false) .allowPipelining(false) @@ -60,7 +58,7 @@ public void builder() { .timezone("auto") .build(); Assertions.assertEquals( - "r2dbc:mariadb:loadbalance://localhost/MyDB?connectTimeout=PT0.15S&tcpKeepAlive=true&tcpAbortiveClose=true&transactionReplay=true&password=***&timezone=auto&pamOtherPwd=otherPwd&prepareCacheSize=125&socket=/path/to/mysocket&username=MyUSer&allowPipelining=false&connectionAttributes=entry1=val1,entry2=val2&sessionVariables=timezone=Europe/Paris&sslMode=trust&serverSslCert=/path/to/serverCert&tlsProtocol=TLSv1.2,TLSv1.3&clientSslKey=clientSecretKey&clientSslPassword=***&sslTunnelDisableHostVerification=true&rsaPublicKey=/path/to/publicRSAKey&cachingRsaPublicKey=cachingRSAPublicKey&allowPublicKeyRetrieval=true&useServerPrepStmts=true&autocommit=false&tinyInt1isBit=false&restrictedAuth=mysql_native_password,client_ed25519&isolationLevel=SERIALIZABLE", + "r2dbc:mariadb:loadbalance://localhost/MyDB?connectTimeout=PT0.15S&tcpKeepAlive=true&tcpAbortiveClose=true&transactionReplay=true&password=***&timezone=auto&pamOtherPwd=otherPwd&prepareCacheSize=125&socket=/path/to/mysocket&username=MyUSer&allowPipelining=false&connectionAttributes=entry1=val1,entry2=val2&sessionVariables=timezone=Europe/Paris&sslMode=trust&serverSslCert=/path/to/serverCert&tlsProtocol=TLSv1.2,TLSv1.3&clientSslKey=clientSecretKey&clientSslPassword=***&sslTunnelDisableHostVerification=true&rsaPublicKey=/path/to/publicRSAKey&cachingRsaPublicKey=cachingRSAPublicKey&allowPublicKeyRetrieval=true&useServerPrepStmts=true&autocommit=false&tinyInt1isBit=false&restrictedAuth=mysql_native_password,client_ed25519", conf.toString()); } @@ -104,7 +102,6 @@ public void connectionString() { + "&cachingRsaPublicKey=cachingRSAPublicKey" + "&allowPublicKeyRetrieval=true" + "&useServerPrepStmts=true" - + "&isolationLevel=SERIALIZABLE" + "&autocommit=false" + "&tinyInt1isBit=false" + "&allowPipelining=false" @@ -140,8 +137,7 @@ public void connectionString() { + "&allowPublicKeyRetrieval=true" + "&autocommit=false" + "&tinyInt1isBit=false" - + "&restrictedAuth=mysql_native_password,client_ed25519" - + "&isolationLevel=SERIALIZABLE", + + "&restrictedAuth=mysql_native_password,client_ed25519", conf.toString()); } @@ -179,7 +175,6 @@ public void connectionStringLoadBalance() { + "&cachingRsaPublicKey=cachingRSAPublicKey" + "&allowPublicKeyRetrieval=true" + "&useServerPrepStmts=true" - + "&isolationLevel=SERIALIZABLE" + "&autocommit=false" + "&tinyInt1isBit=false" + "&allowPipelining=false" @@ -189,7 +184,7 @@ public void connectionStringLoadBalance() { MariadbConnectionConfiguration conf = MariadbConnectionConfiguration.fromOptions(options).build(); Assertions.assertEquals( - "r2dbc:mariadb:loadbalance://localhost/db?connectTimeout=PT0.15S&tcpKeepAlive=true&tcpAbortiveClose=true&transactionReplay=true&password=***&pamOtherPwd=otherPwd&prepareCacheSize=125&socket=/path/to/mysocket&username=ro:ot&allowMultiQueries=true&allowPipelining=false&connectionAttributes=entry1=val1,entry2=val2&sessionVariables=timezone='Europe/Paris'&sslMode=trust&serverSslCert=/path/to/serverCert&tlsProtocol=TLSv1.2,TLSv1.3&clientSslKey=clientSecretKey&clientSslPassword=***&sslTunnelDisableHostVerification=true&rsaPublicKey=/path/to/publicRSAKey&cachingRsaPublicKey=cachingRSAPublicKey&allowPublicKeyRetrieval=true&autocommit=false&tinyInt1isBit=false&restrictedAuth=mysql_native_password,client_ed25519&isolationLevel=SERIALIZABLE", + "r2dbc:mariadb:loadbalance://localhost/db?connectTimeout=PT0.15S&tcpKeepAlive=true&tcpAbortiveClose=true&transactionReplay=true&password=***&pamOtherPwd=otherPwd&prepareCacheSize=125&socket=/path/to/mysocket&username=ro:ot&allowMultiQueries=true&allowPipelining=false&connectionAttributes=entry1=val1,entry2=val2&sessionVariables=timezone='Europe/Paris'&sslMode=trust&serverSslCert=/path/to/serverCert&tlsProtocol=TLSv1.2,TLSv1.3&clientSslKey=clientSecretKey&clientSslPassword=***&sslTunnelDisableHostVerification=true&rsaPublicKey=/path/to/publicRSAKey&cachingRsaPublicKey=cachingRSAPublicKey&allowPublicKeyRetrieval=true&autocommit=false&tinyInt1isBit=false&restrictedAuth=mysql_native_password,client_ed25519", conf.toString()); } diff --git a/src/test/java/org/mariadb/r2dbc/unit/util/BufferUtilsTest.java b/src/test/java/org/mariadb/r2dbc/unit/util/BufferUtilsTest.java index 448ec6f7..7aa02014 100644 --- a/src/test/java/org/mariadb/r2dbc/unit/util/BufferUtilsTest.java +++ b/src/test/java/org/mariadb/r2dbc/unit/util/BufferUtilsTest.java @@ -7,7 +7,6 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; -import io.r2dbc.spi.IsolationLevel; import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -200,8 +199,7 @@ void write() { true, 1, "testr2", - null, - IsolationLevel.REPEATABLE_READ); + null); Context ctx = new SimpleContext( "10.5.5-mariadb", @@ -211,8 +209,7 @@ void write() { true, 1, "testr2", - null, - IsolationLevel.REPEATABLE_READ); + null); ByteBuf buf = allocator.buffer(1000); buf.writerIndex(0);