diff --git a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java index b14e54c1676..77bf29a32fa 100644 --- a/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java +++ b/core/repository/sail/src/main/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnection.java @@ -168,6 +168,9 @@ public void begin() throws RepositoryException { @Override public void begin(IsolationLevel level) throws RepositoryException { try { + // Call setIsolationLevel to update the AbstractRepositoryConnection's isolation level field + setIsolationLevel(level); + // always call receiveTransactionSettings(...) before calling begin(); sailConnection.setTransactionSettings(); @@ -195,6 +198,8 @@ public void begin(TransactionSetting... settings) { for (TransactionSetting setting : settings) { if (setting instanceof IsolationLevel) { + // Call setIsolationLevel to update the AbstractRepositoryConnection's isolation level field + setIsolationLevel((IsolationLevel) setting); sailConnection.begin((IsolationLevel) setting); return; } diff --git a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java index a51983aaf42..697397914ef 100644 --- a/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java +++ b/core/repository/sail/src/test/java/org/eclipse/rdf4j/repository/sail/SailRepositoryConnectionTest.java @@ -22,6 +22,8 @@ import java.util.Optional; import org.eclipse.rdf4j.common.iteration.EmptyIteration; +import org.eclipse.rdf4j.common.transaction.IsolationLevel; +import org.eclipse.rdf4j.common.transaction.IsolationLevels; import org.eclipse.rdf4j.query.BooleanQuery; import org.eclipse.rdf4j.query.GraphQuery; import org.eclipse.rdf4j.query.Query; @@ -29,6 +31,7 @@ import org.eclipse.rdf4j.query.algebra.QueryRoot; import org.eclipse.rdf4j.query.algebra.TupleExpr; import org.eclipse.rdf4j.query.explanation.Explanation; +import org.eclipse.rdf4j.sail.Sail; import org.eclipse.rdf4j.sail.SailConnection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -169,4 +172,47 @@ public void testExplainQuery() { anyBoolean(), anyInt()); } + @Test + public void testGetIsolationLevel_shouldReturnSetLevel() { + // Test that getIsolationLevel() returns the level set via begin(IsolationLevel) + assertThat(subject.getIsolationLevel()).isNull(); + + subject.begin(IsolationLevels.SERIALIZABLE); + assertThat(subject.getIsolationLevel()).isEqualTo(IsolationLevels.SERIALIZABLE); + + subject.rollback(); + + subject.begin(IsolationLevels.READ_COMMITTED); + assertThat(subject.getIsolationLevel()).isEqualTo(IsolationLevels.READ_COMMITTED); + + subject.rollback(); + } + + @Test + public void testGetIsolationLevel_shouldReturnSetLevelFromTransactionSettings() { + // Test that getIsolationLevel() returns the level set via begin(TransactionSetting...) + assertThat(subject.getIsolationLevel()).isNull(); + + subject.begin(IsolationLevels.READ_UNCOMMITTED); + assertThat(subject.getIsolationLevel()).isEqualTo(IsolationLevels.READ_UNCOMMITTED); + + subject.rollback(); + } + + @Test + public void testGetIsolationLevel_shouldReturnDefaultLevelWhenNotExplicitlySet() { + // Test that getIsolationLevel() returns the default isolation level when begin() is called without parameters + assertThat(subject.getIsolationLevel()).isNull(); + + // Create a mock sail that returns the default isolation level + Sail mockSail = mock(Sail.class); + when(mockSail.getDefaultIsolationLevel()).thenReturn(IsolationLevels.READ_COMMITTED); + when(sailRepository.getSail()).thenReturn(mockSail); + + subject.begin(); + assertThat(subject.getIsolationLevel()).isEqualTo(IsolationLevels.READ_COMMITTED); + + subject.rollback(); + } + }