PHOENIX-2549 Modify Phoenix DatabaseMetaData implementation for transaction support
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/fd5fff29 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/fd5fff29 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/fd5fff29 Branch: refs/heads/4.x-HBase-1.0 Commit: fd5fff29fee18b883827a031c5258589ee58019b Parents: 9e66b35 Author: James Taylor <[email protected]> Authored: Wed Dec 30 10:43:30 2015 -0800 Committer: James Taylor <[email protected]> Committed: Wed Dec 30 18:14:26 2015 -0800 ---------------------------------------------------------------------- .../phoenix/exception/SQLExceptionCode.java | 1 + .../apache/phoenix/jdbc/PhoenixConnection.java | 12 ++++-- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 44 +++++--------------- .../apache/phoenix/jdbc/PhoenixDriverTest.java | 27 ++++++++++++ 4 files changed, 48 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd5fff29/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java index 36036ae..228f06f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/exception/SQLExceptionCode.java @@ -282,6 +282,7 @@ public enum SQLExceptionCode { CANNOT_ALTER_TO_BE_TXN_WITH_ROW_TIMESTAMP(1081, "44A12", "Cannot alter table to be transactional table if transactions are disabled"), TX_MUST_BE_ENABLED_TO_SET_TX_CONTEXT(1082, "44A13", "Cannot set transaction context if transactions are disabled"), TX_MUST_BE_ENABLED_TO_SET_AUTO_FLUSH(1083, "44A14", "Cannot set auto flush if transactions are disabled"), + TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL(1084, "44A15", "Cannot set isolation level to TRANSACTION_READ_COMMITTED or TRANSACTION_SERIALIZABLE if transactions are disabled"), /** Sequence related */ SEQUENCE_ALREADY_EXIST(1200, "42Z00", "Sequence already exists.", new Factory() { http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd5fff29/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java index 2d8810f..2a7b933 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixConnection.java @@ -642,7 +642,10 @@ public class PhoenixConnection implements Connection, MetaDataMutated { @Override public int getTransactionIsolation() throws SQLException { - return Connection.TRANSACTION_READ_COMMITTED; + boolean transactionsEnabled = getQueryServices().getProps().getBoolean(QueryServices.TRANSACTIONS_ENABLED, + QueryServicesOptions.DEFAULT_TRANSACTIONS_ENABLED); + return transactionsEnabled ? + Connection.TRANSACTION_SERIALIZABLE : Connection.TRANSACTION_READ_COMMITTED; } @Override @@ -806,8 +809,11 @@ public class PhoenixConnection implements Connection, MetaDataMutated { @Override public void setTransactionIsolation(int level) throws SQLException { - if (level != Connection.TRANSACTION_READ_COMMITTED) { - throw new SQLFeatureNotSupportedException(); + boolean transactionsEnabled = getQueryServices().getProps().getBoolean(QueryServices.TRANSACTIONS_ENABLED, + QueryServicesOptions.DEFAULT_TRANSACTIONS_ENABLED); + if (!transactionsEnabled && (level == Connection.TRANSACTION_REPEATABLE_READ || level == Connection.TRANSACTION_SERIALIZABLE)) { + throw new SQLExceptionInfo.Builder(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL) + .build().buildException(); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd5fff29/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java index 87c02d0..a4748b3 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java @@ -73,30 +73,8 @@ import com.google.common.collect.Lists; /** * - * JDBC DatabaseMetaData implementation of Phoenix reflecting read-only nature of driver. - * Supported metadata methods include: - * {@link #getTables(String, String, String, String[])} - * {@link #getColumns(String, String, String, String)} - * {@link #getTableTypes()} - * {@link #getPrimaryKeys(String, String, String)} - * {@link #getIndexInfo(String, String, String, boolean, boolean)} - * {@link #getSchemas()} - * {@link #getSchemas(String, String)} - * {@link #getDatabaseMajorVersion()} - * {@link #getDatabaseMinorVersion()} - * {@link #getClientInfoProperties()} - * {@link #getConnection()} - * {@link #getDatabaseProductName()} - * {@link #getDatabaseProductVersion()} - * {@link #getDefaultTransactionIsolation()} - * {@link #getDriverName()} - * {@link #getDriverVersion()} - * {@link #getSuperTables(String, String, String)} - * {@link #getCatalogs()} - * Other ResultSet methods return an empty result set. - * - * - * @since 0.1 + * JDBC DatabaseMetaData implementation of Phoenix. + * */ public class PhoenixDatabaseMetaData implements DatabaseMetaData { public static final int INDEX_NAME_INDEX = 4; // Shared with FAMILY_NAME_INDEX @@ -1156,32 +1134,32 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { @Override public boolean othersDeletesAreVisible(int type) throws SQLException { - return true; + return false; } @Override public boolean othersInsertsAreVisible(int type) throws SQLException { - return true; + return false; } @Override public boolean othersUpdatesAreVisible(int type) throws SQLException { - return true; + return false; } @Override public boolean ownDeletesAreVisible(int type) throws SQLException { - return false; + return true; } @Override public boolean ownInsertsAreVisible(int type) throws SQLException { - return false; + return true; } @Override public boolean ownUpdatesAreVisible(int type) throws SQLException { - return false; + return true; } @Override @@ -1387,7 +1365,7 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { @Override public boolean supportsMultipleTransactions() throws SQLException { - return false; + return true; } @Override @@ -1534,12 +1512,12 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { @Override public boolean supportsTransactionIsolationLevel(int level) throws SQLException { - return level == connection.getTransactionIsolation(); + return true; } @Override public boolean supportsTransactions() throws SQLException { - return false; + return true; } @Override http://git-wip-us.apache.org/repos/asf/phoenix/blob/fd5fff29/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java index 61dc442..b70ea71 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/jdbc/PhoenixDriverTest.java @@ -87,4 +87,31 @@ public class PhoenixDriverTest extends BaseConnectionlessQueryTest { assertEquals(SQLExceptionCode.INVALID_SCN.getErrorCode(), e.getErrorCode()); } } + + @Test + public void testDisallowIsolationLevel() throws SQLException { + Connection conn = DriverManager.getConnection(getUrl()); + conn.setTransactionIsolation(Connection.TRANSACTION_NONE); + conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); + conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); + try { + conn = DriverManager.getConnection(getUrl()); + conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); + fail(); + } catch(SQLException e) { + assertEquals(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL.getErrorCode(), e.getErrorCode()); + } + try { + conn = DriverManager.getConnection(getUrl()); + conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + fail(); + } catch(SQLException e) { + assertEquals(SQLExceptionCode.TX_MUST_BE_ENABLED_TO_SET_ISOLATION_LEVEL.getErrorCode(), e.getErrorCode()); + } + Properties props = PropertiesUtil.deepCopy(TestUtil.TEST_PROPERTIES); + props.setProperty(QueryServices.TRANSACTIONS_ENABLED, Boolean.toString(true)); + conn = DriverManager.getConnection(getUrl(), props); + conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); + conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + } }
