zstan commented on code in PR #13112:
URL: https://github.com/apache/ignite/pull/13112#discussion_r3208122389
##########
docs/_docs/SQL/JDBC/jdbc-driver.adoc:
##########
@@ -555,6 +555,46 @@ In addition to generic DataSource properties,
`IgniteJdbcThinDataSource` support
Refer to the
link:{javadoc_base_url}/org/apache/ignite/IgniteJdbcThinDataSource.html[JavaDocs]
for more details.
+== Transaction Savepoints
+
+JDBC Thin Driver supports the standard JDBC savepoint API for explicit
transactions:
+
+* `Connection.setSavepoint()`
+* `Connection.setSavepoint(String name)`
+* `Connection.rollback(Savepoint savepoint)`
+* `Connection.releaseSavepoint(Savepoint savepoint)`
+
+Savepoints are available for JDBC connections that use the Calcite-based SQL
engine and explicit `PESSIMISTIC` transactions.
+Disable auto-commit before creating a savepoint.
Review Comment:
Otherwize what ?
##########
modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java:
##########
@@ -1695,11 +1695,17 @@ public void testReleaseSavepoint() throws Exception {
final Savepoint savepoint = getFakeSavepoint();
- checkNotSupported(new RunnableX() {
- @Override public void runx() throws Exception {
- conn.releaseSavepoint(savepoint);
- }
- });
+ assertThrows(log,
+ new Callable<Object>() {
Review Comment:
```suggestion
new Callable<>() {
```
##########
docs/_docs/SQL/JDBC/jdbc-driver.adoc:
##########
@@ -555,6 +555,46 @@ In addition to generic DataSource properties,
`IgniteJdbcThinDataSource` support
Refer to the
link:{javadoc_base_url}/org/apache/ignite/IgniteJdbcThinDataSource.html[JavaDocs]
for more details.
+== Transaction Savepoints
+
+JDBC Thin Driver supports the standard JDBC savepoint API for explicit
transactions:
+
+* `Connection.setSavepoint()`
+* `Connection.setSavepoint(String name)`
+* `Connection.rollback(Savepoint savepoint)`
+* `Connection.releaseSavepoint(Savepoint savepoint)`
+
+Savepoints are available for JDBC connections that use the Calcite-based SQL
engine and explicit `PESSIMISTIC` transactions.
+Disable auto-commit before creating a savepoint.
+
+[source,java]
+----
+try (Connection conn = DriverManager.getConnection(
+ "jdbc:ignite:thin://127.0.0.1?transactionConcurrency=PESSIMISTIC")) {
+ conn.setAutoCommit(false);
+
+ try (Statement stmt = conn.createStatement()) {
+ stmt.executeUpdate("INSERT INTO Person(id, name) VALUES (1, 'John')");
+
+ Savepoint savepoint = conn.setSavepoint("before_update");
+
+ stmt.executeUpdate("UPDATE Person SET name = 'Jane' WHERE id = 1");
+
+ conn.rollback(savepoint);
+ conn.releaseSavepoint(savepoint);
Review Comment:
from this example is not clear - what was the final state of row **name**
where **id** = 1, can you extend this test plz ? I suppose pure java:
**assert** expectation would be enough here
##########
modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSavepointTest.java:
##########
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.jdbc.thin;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.calcite.CalciteQueryEngineConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.SqlConfiguration;
+import org.apache.ignite.configuration.TransactionConfiguration;
+import org.junit.Test;
+
+/** Savepoint tests for thin JDBC connection. */
+public class JdbcThinConnectionSavepointTest extends JdbcThinAbstractSelfTest {
+ /** */
+ private static final String TBL = "SAVEPOINT_TEST_TABLE";
+
+ /** URL. */
+ private String url = partitionAwareness ?
+ "jdbc:ignite:thin://127.0.0.1:10800..10802" :
+ "jdbc:ignite:thin://127.0.0.1";
+
+ /** Nodes count. */
+ private int nodesCnt = partitionAwareness ? 4 : 2;
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
+ return super.getConfiguration(igniteInstanceName)
+ .setTransactionConfiguration(new TransactionConfiguration()
+ .setTxAwareQueriesEnabled(true))
+ .setSqlConfiguration(new SqlConfiguration()
+ .setQueryEnginesConfiguration(new
CalciteQueryEngineConfiguration()));
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ super.beforeTestsStarted();
+
+ startGridsMultiThreaded(nodesCnt);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ stopAllGrids();
+
+ super.afterTestsStopped();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTest() throws Exception {
+ super.beforeTest();
+
+ try (Connection conn = connection()) {
+ execute(conn, "DROP TABLE IF EXISTS " + TBL);
+ execute(conn, "CREATE TABLE " + TBL + "(ID INT PRIMARY KEY, VAL
VARCHAR) WITH atomicity=transactional");
+ }
+ }
+
+ /** */
+ @Test
+ public void testJdbcSavepointApiRollsBackSqlDmlChanges() throws Exception {
+ try (Connection conn = connection()) {
+ assertTrue(conn.getMetaData().supportsSavepoints());
+
+ conn.setAutoCommit(false);
+
+ try {
+ execute(conn, "INSERT INTO " + TBL + " VALUES (1,
'before_sp1')");
+
+ Savepoint sp1 = conn.setSavepoint("sp1");
+
+ execute(conn, "UPDATE " + TBL + " SET VAL = 'after_sp1' WHERE
ID = 1");
+ execute(conn, "INSERT INTO " + TBL + " VALUES (2,
'after_sp1')");
+
+ Savepoint sp2 = conn.setSavepoint("sp2");
+
+ execute(conn, "DELETE FROM " + TBL + " WHERE ID = 1");
+ execute(conn, "INSERT INTO " + TBL + " VALUES (3,
'after_sp2')");
+
+ assertQuery(conn, 2, "after_sp1", 3, "after_sp2");
+
+ conn.rollback(sp2);
+
+ assertQuery(conn, 1, "after_sp1", 2, "after_sp1");
+
+ conn.releaseSavepoint(sp2);
+ conn.rollback(sp1);
+
+ assertQuery(conn, 1, "before_sp1");
+
+ conn.releaseSavepoint(sp1);
Review Comment:
plz append additional test, from java doc :
java.sql.Connection#releaseSavepoint
```
Any reference to the savepoint after it have been removed will cause an
SQLException to be thrown.
```
thus test like :
```
Savepoint sp1 = conn.setSavepoint("sp1");
conn.releaseSavepoint(sp1);
conn.rollback(sp1);
```
need to fail correctly
Probably test
org.apache.ignite.jdbc.thin.JdbcThinConnectionSelfTest#testReleaseSavepoint
need to be expanded, i see only null and fake = not exist safePoints been
checked there
##########
modules/clients/pom.xml:
##########
@@ -73,6 +73,12 @@
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
Review Comment:
probably it`s better to have Calcite related test in Calcite ?
check:
package org.apache.ignite.internal.processors.query.calcite.jdbc;
##########
docs/_docs/SQL/JDBC/jdbc-driver.adoc:
##########
@@ -555,6 +555,46 @@ In addition to generic DataSource properties,
`IgniteJdbcThinDataSource` support
Refer to the
link:{javadoc_base_url}/org/apache/ignite/IgniteJdbcThinDataSource.html[JavaDocs]
for more details.
+== Transaction Savepoints
+
+JDBC Thin Driver supports the standard JDBC savepoint API for explicit
transactions:
+
+* `Connection.setSavepoint()`
+* `Connection.setSavepoint(String name)`
+* `Connection.rollback(Savepoint savepoint)`
+* `Connection.releaseSavepoint(Savepoint savepoint)`
+
+Savepoints are available for JDBC connections that use the Calcite-based SQL
engine and explicit `PESSIMISTIC` transactions.
+Disable auto-commit before creating a savepoint.
+
+[source,java]
+----
+try (Connection conn = DriverManager.getConnection(
+ "jdbc:ignite:thin://127.0.0.1?transactionConcurrency=PESSIMISTIC")) {
+ conn.setAutoCommit(false);
+
+ try (Statement stmt = conn.createStatement()) {
+ stmt.executeUpdate("INSERT INTO Person(id, name) VALUES (1, 'John')");
+
+ Savepoint savepoint = conn.setSavepoint("before_update");
+
+ stmt.executeUpdate("UPDATE Person SET name = 'Jane' WHERE id = 1");
+
+ conn.rollback(savepoint);
+ conn.releaseSavepoint(savepoint);
+ conn.commit();
+ }
+ catch (Throwable t) {
+ conn.rollback();
+
+ throw t;
+ }
+}
+----
+
+You can also use SQL savepoint commands, such as `SAVEPOINT` and `ROLLBACK TO
SAVEPOINT`, from JDBC statements.
Review Comment:
probably in the third person would be more accurate, smth like : SQL
savepoint command can be used ...
##########
modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSavepointTest.java:
##########
@@ -0,0 +1,256 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.jdbc.thin;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.calcite.CalciteQueryEngineConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.SqlConfiguration;
+import org.apache.ignite.configuration.TransactionConfiguration;
+import org.junit.Test;
+
+/** Savepoint tests for thin JDBC connection. */
+public class JdbcThinConnectionSavepointTest extends JdbcThinAbstractSelfTest {
+ /** */
+ private static final String TBL = "SAVEPOINT_TEST_TABLE";
+
+ /** URL. */
+ private String url = partitionAwareness ?
Review Comment:
```suggestion
private final String url = partitionAwareness ?
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]