Skip to content

Commit c98d831

Browse files
committed
Updated implementation of TableTxExecutor
1 parent 369c344 commit c98d831

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

jdbc/src/main/java/tech/ydb/jdbc/context/TableTxExecutor.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,20 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
8787
@Override
8888
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params,
8989
long timeout, boolean keepInCache) throws SQLException {
90-
YdbQueryResult result = super.executeDataQuery(statement, query, preparedYql, params, timeout, keepInCache);
91-
isWriteTx = isInsideTransaction() && (isWriteTx || query.isWriting());
90+
try {
91+
YdbQueryResult result = super.executeDataQuery(statement, query, preparedYql, params, timeout, keepInCache);
92+
isWriteTx = isInsideTransaction() && (isWriteTx || query.isWriting());
93+
return result;
94+
} catch (YdbConditionallyRetryableException ex) {
95+
if (isAutoCommit()) {
96+
throw ex;
97+
}
9298

93-
return result;
99+
Status status = Status.of(StatusCode.ABORTED).withCause(ex);
100+
throw ExceptionFactory.createException("Data query wasn't executed",
101+
new UnexpectedResultException(ex.getMessage(), status)
102+
);
103+
}
94104
}
95105

96106
@Override

jdbc/src/test/java/tech/ydb/jdbc/YdbDriverTxValidateTest.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import tech.ydb.core.StatusCode;
1919
import tech.ydb.core.UnexpectedResultException;
2020
import tech.ydb.jdbc.context.YdbContext;
21+
import tech.ydb.jdbc.context.YdbExecutor;
22+
import tech.ydb.jdbc.exception.YdbConditionallyRetryableException;
23+
import tech.ydb.jdbc.exception.YdbRetryableException;
2124
import tech.ydb.jdbc.impl.YdbTracerImpl;
2225
import tech.ydb.jdbc.impl.helper.ExceptionAssert;
2326
import tech.ydb.jdbc.impl.helper.JdbcConnectionExtention;
@@ -153,6 +156,52 @@ public void commitedTxTest() throws SQLException {
153156
}
154157
}
155158

159+
@Test
160+
public void executeDataQueryTest() throws SQLException {
161+
String url = jdbcURL.withArg("withTxValidationTable", "tx1_store").build();
162+
try (Connection conn = DriverManager.getConnection(url)) {
163+
ErrorTxTracer tracer = YdbTracerImpl.use(new ErrorTxTracer());
164+
// table was created automatically
165+
assertTxCount("tx1_store", 0);
166+
167+
conn.setAutoCommit(true);
168+
try (Statement st = conn.createStatement()) {
169+
st.execute("DELETE FROM tx1_store");
170+
171+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.UNDETERMINED));
172+
YdbConditionallyRetryableException e = Assertions.assertThrows(YdbConditionallyRetryableException.class,
173+
() -> st.execute("DELETE FROM tx1_store"));
174+
Assertions.assertEquals(Status.of(StatusCode.UNDETERMINED), e.getStatus());
175+
176+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.ABORTED));
177+
YdbRetryableException e2 = Assertions.assertThrows(YdbRetryableException.class,
178+
() -> st.execute("DELETE FROM tx1_store"));
179+
Assertions.assertEquals(Status.of(StatusCode.ABORTED), e2.getStatus());
180+
}
181+
182+
183+
conn.setAutoCommit(false);
184+
try (Statement st = conn.createStatement()) {
185+
YdbExecutor executor = st.unwrap(YdbStatement.class).getConnection().getExecutor();
186+
st.execute("DELETE FROM tx1_store");
187+
conn.commit();
188+
189+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.UNDETERMINED));
190+
YdbRetryableException e = Assertions.assertThrows(YdbRetryableException.class,
191+
() -> st.execute("DELETE FROM tx1_store"));
192+
Assertions.assertEquals(StatusCode.ABORTED, e.getStatus().getCode());
193+
Assertions.assertNotNull(e.getStatus().getCause());
194+
195+
tracer.throwErrorOn("<-- Status", Status.of(StatusCode.ABORTED));
196+
YdbRetryableException e2 = Assertions.assertThrows(YdbRetryableException.class,
197+
() -> st.execute("DELETE FROM tx1_store"));
198+
Assertions.assertEquals(Status.of(StatusCode.ABORTED), e2.getStatus());
199+
}
200+
} finally {
201+
jdbc.connection().createStatement().execute("DROP TABLE tx1_store");
202+
}
203+
}
204+
156205
@Test
157206
public void invalididTxTableTest() throws SQLException {
158207
String url = jdbcURL.withArg("withTxValidationTable", "tx store").build();

0 commit comments

Comments
 (0)