Skip to content

Commit ac65cd6

Browse files
committed
#80 add some docs
1 parent 72a96d4 commit ac65cd6

File tree

4 files changed

+48
-10
lines changed

4 files changed

+48
-10
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
66

77
## [Unreleased]
88

9+
- added support for transactions offering a platform transaction manager based on stream transactions (#80)
910

1011
## [3.7.1] - 2022-08-19
1112

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
* Transaction manager using ArangoDB stream transactions on the
1616
* {@linkplain ArangoOperations#getDatabaseName()} current database} of the template.
1717
* Isolation level {@linkplain TransactionDefinition#ISOLATION_SERIALIZABLE serializable} is not supported.
18-
*
19-
* @see ArangoDatabase#beginStreamTransaction(StreamTransactionOptions)
2018
*/
2119
public class ArangoTransactionManager extends AbstractPlatformTransactionManager {
2220

@@ -26,11 +24,7 @@ public class ArangoTransactionManager extends AbstractPlatformTransactionManager
2624
public ArangoTransactionManager(ArangoOperations operations, QueryTransactionBridge bridge) {
2725
this.operations = operations;
2826
this.bridge = bridge;
29-
setNestedTransactionAllowed(false);
30-
setTransactionSynchronization(SYNCHRONIZATION_ALWAYS);
3127
setValidateExistingTransaction(true);
32-
setGlobalRollbackOnParticipationFailure(true);
33-
setRollbackOnCommitFailure(true);
3428
}
3529

3630
/**
@@ -53,6 +47,7 @@ protected Object doGetTransaction() {
5347
/**
5448
* Configures the new transaction object. The resulting resource will be synchronized and the bridge will be initialized.
5549
*
50+
* @see ArangoDatabase#beginStreamTransaction(StreamTransactionOptions)
5651
* @see QueryTransactionBridge
5752
*/
5853
@Override
@@ -71,6 +66,8 @@ protected void doBegin(Object transaction, TransactionDefinition definition) thr
7166

7267
/**
7368
* Commit the current stream transaction iff any. The bridge is cleared afterwards.
69+
*
70+
* @see ArangoDatabase#commitStreamTransaction(String)
7471
*/
7572
@Override
7673
protected void doCommit(DefaultTransactionStatus status) throws TransactionException {
@@ -88,6 +85,8 @@ protected void doCommit(DefaultTransactionStatus status) throws TransactionExcep
8885

8986
/**
9087
* Roll back the current stream transaction iff any. The bridge is cleared afterwards.
88+
*
89+
* @see ArangoDatabase#abortStreamTransaction(String)
9190
*/
9291
@Override
9392
protected void doRollback(DefaultTransactionStatus status) throws TransactionException {
@@ -103,9 +102,14 @@ protected void doRollback(DefaultTransactionStatus status) throws TransactionExc
103102
}
104103
}
105104

105+
/**
106+
* Check if the transaction objects has an underlying stream transaction.
107+
*
108+
* @see ArangoDatabase#getStreamTransaction(String)
109+
*/
106110
@Override
107111
protected boolean isExistingTransaction(Object transaction) throws TransactionException {
108-
return transaction instanceof ArangoTransactionObject && ((ArangoTransactionObject) transaction).exists();
112+
return ((ArangoTransactionObject) transaction).exists();
109113
}
110114

111115
@Override

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ ArangoTransactionResource getResource() {
4141
}
4242

4343
boolean exists() {
44-
return resource.getStreamTransactionId() != null;
44+
return getStreamTransaction() != null;
4545
}
4646

4747
void configure(TransactionDefinition definition) {
@@ -116,9 +116,14 @@ private void addCollections(Collection<String> collections) {
116116
}
117117

118118
private boolean isStatus(StreamTransactionStatus status) {
119+
getStreamTransaction();
120+
return transaction != null && transaction.getStatus() == status;
121+
}
122+
123+
private StreamTransactionEntity getStreamTransaction() {
119124
if (transaction == null && resource.getStreamTransactionId() != null) {
120125
transaction = database.getStreamTransaction(resource.getStreamTransactionId());
121126
}
122-
return transaction != null && transaction.getStatus() == status;
127+
return transaction;
123128
}
124129
}

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,45 @@
11
package com.arangodb.springframework.transaction;
22

33
import org.springframework.transaction.PlatformTransactionManager;
4+
import org.springframework.transaction.TransactionDefinition;
45
import org.springframework.transaction.interceptor.TransactionAttribute;
56
import org.springframework.transaction.support.TransactionTemplate;
67

78
import java.util.Collection;
89
import java.util.Collections;
10+
import java.util.function.Predicate;
911

12+
/**
13+
* Template class that simplifies programmatic transaction demarcation and
14+
* transaction exception handling in combination with a transaction manager using labels.
15+
*
16+
* @see ArangoTransactionManager
17+
*/
1018
public class TransactionAttributeTemplate extends TransactionTemplate implements TransactionAttribute {
1119

20+
private static final Predicate<Throwable> DEFAULT_ROLLBACK_ON = ex -> (ex instanceof RuntimeException || ex instanceof Error);
21+
1222
private String qualifier;
1323
private Collection<String> labels = Collections.emptyList();
24+
private Predicate<Throwable> rollbackOn = DEFAULT_ROLLBACK_ON;
25+
26+
public TransactionAttributeTemplate() {
27+
}
1428

1529
public TransactionAttributeTemplate(PlatformTransactionManager transactionManager) {
1630
super(transactionManager);
1731
}
1832

33+
public TransactionAttributeTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) {
34+
super(transactionManager, transactionDefinition);
35+
if (transactionDefinition instanceof TransactionAttribute) {
36+
TransactionAttribute transactionAttribute = (TransactionAttribute) transactionDefinition;
37+
setQualifier(transactionAttribute.getQualifier());
38+
setLabels(transactionAttribute.getLabels());
39+
setRollbackOn(transactionAttribute::rollbackOn);
40+
}
41+
}
42+
1943
@Override
2044
public String getQualifier() {
2145
return qualifier;
@@ -36,6 +60,10 @@ public void setLabels(Collection<String> labels) {
3660

3761
@Override
3862
public boolean rollbackOn(Throwable ex) {
39-
return (ex instanceof RuntimeException || ex instanceof Error);
63+
return rollbackOn.test(ex);
64+
}
65+
66+
public void setRollbackOn(Predicate<Throwable> rollbackOn) {
67+
this.rollbackOn = rollbackOn;
4068
}
4169
}

0 commit comments

Comments
 (0)