Skip to content

Commit 2c7e4a3

Browse files
committed
arangodb#80 allow multiple transaction calls unless there are no additional collections allowed
1 parent 5e0a6a6 commit 2c7e4a3

File tree

6 files changed

+33
-28
lines changed

6 files changed

+33
-28
lines changed

src/main/java/com/arangodb/springframework/repository/query/AbstractArangoQuery.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public Object execute(final Object[] parameters) {
7878

7979
final Pair<String, ? extends Collection<String>> queryAndCollection = createQuery(accessor, bindVars);
8080
if (options.getStreamTransactionId() == null && transactionBridge != null) {
81-
options.streamTransactionId(transactionBridge.beginCurrentTransaction(queryAndCollection.getSecond()));
81+
options.streamTransactionId(transactionBridge.getCurrentTransaction(queryAndCollection.getSecond()));
8282
}
8383

8484

src/main/java/com/arangodb/springframework/repository/query/QueryTransactionBridge.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,21 @@
1010
*/
1111
public class QueryTransactionBridge {
1212
private static final Function<Collection<String>, String> NO_TRANSACTION = any -> null;
13-
private static final ThreadLocal<Function<Collection<String>, String>> CURRENT_TRANSACTION_BEGIN = new NamedInheritableThreadLocal<>("ArangoTransactionBegin");
13+
private static final ThreadLocal<Function<Collection<String>, String>> CURRENT_TRANSACTION = new NamedInheritableThreadLocal<>("ArangoTransactionBegin");
1414

1515
public QueryTransactionBridge() {
16-
CURRENT_TRANSACTION_BEGIN.set(NO_TRANSACTION);
16+
CURRENT_TRANSACTION.set(NO_TRANSACTION);
1717
}
1818

19-
public void setCurrentTransactionBegin(Function<Collection<String>, String> begin) {
20-
CURRENT_TRANSACTION_BEGIN.set(begin);
19+
public void setCurrentTransaction(Function<Collection<String>, String> begin) {
20+
CURRENT_TRANSACTION.set(begin);
2121
}
2222

23-
public void clearCurrentTransactionBegin() {
24-
CURRENT_TRANSACTION_BEGIN.set(NO_TRANSACTION);
23+
public void clearCurrentTransaction() {
24+
CURRENT_TRANSACTION.set(NO_TRANSACTION);
2525
}
2626

27-
public String beginCurrentTransaction(Collection<String> collections) {
28-
return CURRENT_TRANSACTION_BEGIN.get().apply(collections);
27+
public String getCurrentTransaction(Collection<String> collections) {
28+
return CURRENT_TRANSACTION.get().apply(collections);
2929
}
3030
}

src/main/java/com/arangodb/springframework/transaction/ArangoTransaction.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
class ArangoTransaction implements SmartTransactionObject {
1717

1818
private final ArangoDatabase database;
19+
20+
private final Set<String> writeCollections = new HashSet<>();
1921
private TransactionDefinition definition;
2022
private StreamTransactionEntity transaction;
2123

@@ -29,19 +31,22 @@ boolean exists() {
2931

3032
void configure(TransactionDefinition definition) {
3133
this.definition = definition;
34+
if (definition instanceof TransactionAttribute) {
35+
writeCollections.addAll(((TransactionAttribute) definition).getLabels());
36+
}
3237
}
3338

34-
String begin(Collection<String> collections) {
39+
String getOrBegin(Collection<String> collections) {
3540
if (transaction != null) {
36-
throw new IllegalTransactionStateException("Stream transaction already started");
37-
}
38-
Set<String> allCollections = new HashSet<>(collections);
39-
if (definition instanceof TransactionAttribute) {
40-
allCollections.addAll(((TransactionAttribute) definition).getLabels());
41+
if (!writeCollections.containsAll(collections)) {
42+
throw new IllegalTransactionStateException("Stream transaction already started, no additional collections allowed");
43+
}
44+
return transaction.getId();
4145
}
46+
writeCollections.addAll(collections);
4247
StreamTransactionOptions options = new StreamTransactionOptions()
4348
.allowImplicit(true)
44-
.writeCollections(allCollections.toArray(new String[0]))
49+
.writeCollections(writeCollections.toArray(new String[0]))
4550
.lockTimeout(definition.getTimeout() == -1 ? 0 : definition.getTimeout());
4651
transaction = database.beginStreamTransaction(options);
4752
return transaction.getId();

src/main/java/com/arangodb/springframework/transaction/ArangoTransactionManager.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ protected void doBegin(Object transaction, TransactionDefinition definition) thr
4343
}
4444
ArangoTransaction tx = (ArangoTransaction) transaction;
4545
tx.configure(definition);
46-
Function<Collection<String>, String> begin = tx::begin;
47-
bridge.setCurrentTransactionBegin(begin.andThen(id -> {
46+
Function<Collection<String>, String> begin = tx::getOrBegin;
47+
bridge.setCurrentTransaction(begin.andThen(id -> {
4848
if (logger.isDebugEnabled()) {
4949
logger.debug("Began stream transaction " + id);
5050
}
@@ -59,7 +59,7 @@ protected void doCommit(DefaultTransactionStatus status) throws TransactionExcep
5959
logger.debug("Commit stream transaction " + tx);
6060
}
6161
tx.commit();
62-
bridge.clearCurrentTransactionBegin();
62+
bridge.clearCurrentTransaction();
6363
}
6464

6565
@Override
@@ -69,7 +69,7 @@ protected void doRollback(DefaultTransactionStatus status) throws TransactionExc
6969
logger.debug("Rollback stream transaction " + tx);
7070
}
7171
tx.rollback();
72-
bridge.clearCurrentTransactionBegin();
72+
bridge.clearCurrentTransaction();
7373
}
7474

7575
@Override

src/test/java/com/arangodb/springframework/repository/query/QueryTransactionBridgeTest.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@ public class QueryTransactionBridgeTest {
1313
private QueryTransactionBridge underTest = new QueryTransactionBridge();
1414

1515
@Test
16-
public void beginCurrentTransactionInitiallyReturnsNull() {
17-
assertThat(underTest.beginCurrentTransaction(Collections.singleton("test")), Matchers.nullValue());
16+
public void getCurrentTransactionInitiallyReturnsNull() {
17+
assertThat(underTest.getCurrentTransaction(Collections.singleton("test")), Matchers.nullValue());
1818
}
1919

2020
@Test
21-
public void setCurrentTransactionBeginIsAppliedOnBeginCurrentTransaction() {
22-
underTest.setCurrentTransactionBegin(collections -> collections.iterator().next());
23-
assertThat(underTest.beginCurrentTransaction(Collections.singleton("test")), Matchers.is("test"));
21+
public void setCurrentTransactionIsAppliedOnGetCurrentTransaction() {
22+
underTest.setCurrentTransaction(collections -> collections.iterator().next());
23+
assertThat(underTest.getCurrentTransaction(Collections.singleton("test")), Matchers.is("test"));
2424
}
2525

2626
@After
2727
public void cleanup() {
28-
underTest.clearCurrentTransactionBegin();
28+
underTest.clearCurrentTransaction();
2929
}
3030
}

src/test/java/com/arangodb/springframework/transaction/ArangoTransactionManagerTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public void getTransactionReturnsNewTransactionWithoutStreamTransaction() {
6767
TransactionStatus transaction = underTest.getTransaction(new DefaultTransactionAttribute());
6868
assertThat(transaction.isNewTransaction(), is(true));
6969
verify(driver).db(DATABASE_NAME);
70-
verify(bridge).setCurrentTransactionBegin(any());
70+
verify(bridge).setCurrentTransaction(any());
7171
verifyNoInteractions(database);
7272
}
7373

@@ -81,7 +81,7 @@ public void getTransactionReturnsTransactionCreatesStreamTransactionOnBridgeBegi
8181
.thenReturn("123");
8282
when(database.beginStreamTransaction(any()))
8383
.thenReturn(streamTransaction);
84-
verify(bridge).setCurrentTransactionBegin(beginPassed.capture());
84+
verify(bridge).setCurrentTransaction(beginPassed.capture());
8585
beginPassed.getValue().apply(Arrays.asList("foo", "bar"));
8686
verify(database).beginStreamTransaction(optionsPassed.capture());
8787
assertThat(optionsPassed.getValue().getAllowImplicit(), is(true));

0 commit comments

Comments
 (0)