Skip to content

Commit 998c3ee

Browse files
committed
Update transactions documentation for native transaction support.
Closes #1454,#1512.
1 parent 4974e00 commit 998c3ee

File tree

10 files changed

+306
-65
lines changed

10 files changed

+306
-65
lines changed

README.adoc

+18
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,24 @@ Building the documentation builds also the project without running tests.
179179

180180
The generated documentation is available from `target/site/reference/html/index.html`.
181181

182+
=== Building and staging reference documentation for review
183+
184+
[source,bash]
185+
----
186+
mvn generate-resources
187+
docs=`pwd`/target/site/reference/html
188+
cd /tmp
189+
# see https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site
190+
git clone [email protected]:mikereiche/staged.git -b gh-pages
191+
cd staged
192+
cp -R $docs/* .
193+
git add .
194+
git commit --message "stage for review"
195+
git push origin gh-pages
196+
----
197+
198+
The generated documentation is available from `target/site/reference/html/index.html`.
199+
182200
== Examples
183201

184202
* https://github.com/spring-projects/spring-data-examples/[Spring Data Examples] contains example projects that explain specific features in more detail.

pom.xml

+12
Original file line numberDiff line numberDiff line change
@@ -301,8 +301,20 @@
301301
<artifactId>maven-assembly-plugin</artifactId>
302302
</plugin>
303303
<plugin>
304+
<!-- generate asciidoc to stage for review -->
304305
<groupId>org.asciidoctor</groupId>
305306
<artifactId>asciidoctor-maven-plugin</artifactId>
307+
<executions>
308+
<execution>
309+
<phase>generate-resources</phase>
310+
<goals>
311+
<goal>process-asciidoc</goal>
312+
</goals>
313+
<configuration>
314+
<outputDirectory>target/site/reference/html</outputDirectory>
315+
</configuration>
316+
</execution>
317+
</executions>
306318
</plugin>
307319
<plugin>
308320
<groupId>com.mysema.maven</groupId>

src/main/asciidoc/transactions.adoc

+235-52
Large diffs are not rendered by default.

src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java

+11
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
5252
import org.springframework.transaction.interceptor.TransactionAttributeSource;
5353
import org.springframework.transaction.interceptor.TransactionInterceptor;
54+
import org.springframework.transaction.support.TransactionTemplate;
5455
import org.springframework.util.ClassUtils;
5556
import org.springframework.util.StringUtils;
5657

@@ -330,6 +331,16 @@ CouchbaseCallbackTransactionManager couchbaseTransactionManager(CouchbaseClientF
330331
return new CouchbaseCallbackTransactionManager(clientFactory);
331332
}
332333

334+
/**
335+
* The default transaction template manager.
336+
*
337+
* @param couchbaseTransactionManager
338+
* @return
339+
*/
340+
@Bean(BeanNames.COUCHBASE_TRANSACTION_TEMPLATE)
341+
TransactionTemplate couchbaseTransactionTemplate(CouchbaseCallbackTransactionManager couchbaseTransactionManager) {
342+
return new TransactionTemplate(couchbaseTransactionManager);
343+
}
333344
/**
334345
* The default TransactionalOperator.
335346
*

src/main/java/org/springframework/data/couchbase/config/BeanNames.java

+2
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,7 @@ public class BeanNames {
6464

6565
public static final String COUCHBASE_TRANSACTION_MANAGER = "couchbaseTransactionManager";
6666

67+
public static final String COUCHBASE_TRANSACTION_TEMPLATE = "couchbaseTransactionTemplate";
68+
6769
public static final String COUCHBASE_TRANSACTIONAL_OPERATOR = "couchbaseTransactionalOperator";
6870
}

src/test/java/org/springframework/data/couchbase/domain/CapellaConnectSample.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,11 @@ public static void main(String... args) {
9090
}
9191

9292
ClusterEnvironment env = ClusterEnvironment.builder()
93-
.securityConfig(SecurityConfig.enableTls(true)/*.trustManagerFactory(InsecureTrustManagerFactory.INSTANCE)*/)
93+
//.securityConfig(SecurityConfig.enableTls(true)/*.trustManagerFactory(InsecureTrustManagerFactory.INSTANCE)*/)
9494
.ioConfig(IoConfig.enableDnsSrv(true)).build();
9595

9696
// Initialize the Connection
97+
endpoint = "cb.zsibzkbgllfbcj8g.cloud.couchbase.com";
9798
Cluster cluster = Cluster.connect(endpoint, ClusterOptions.clusterOptions(username, password).environment(env));
9899
Bucket bucket = cluster.bucket(bucketName);
99100
bucket.waitUntilReady(Duration.parse("PT10S"));
@@ -130,8 +131,10 @@ public static List<String> getClustersControlPlane() {
130131
Map<String, Object> decoded = doRequest(hostname, "GET", "/v3/clusters");
131132
HashMap data = (HashMap) decoded.get("data");
132133
List<Map> items = (List<Map>) data.get("items");
133-
for (Map m : items) {
134-
clusterIds.add((String) m.get("id"));
134+
if (items != null) {
135+
for (Map m : items) {
136+
clusterIds.add((String) m.get("id"));
137+
}
135138
}
136139
return clusterIds;
137140
}

src/test/java/org/springframework/data/couchbase/transactions/CouchbaseTransactionalRepositoryIntegrationTests.java

-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ public void saveRolledBack() {
114114
String id = UUID.randomUUID().toString();
115115

116116
assertThrowsWithCause(() -> {
117-
;
118117
userService.run(repo -> {
119118
User user = repo.save(new User(id, "Ada", "Lovelace"));
120119
SimulateFailureException.throwEx("fail");

src/test/java/org/springframework/data/couchbase/transactions/PersonService.java

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
*/
4444
@Service
4545
@Component
46-
@EnableTransactionManagement
4746
class PersonService {
4847

4948
final CouchbaseOperations personOperations;

src/test/java/org/springframework/data/couchbase/transactions/TransactionTemplateIntegrationTests.java

+7-8
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
@IgnoreWhen(missesCapabilities = Capabilities.QUERY, clusterTypes = ClusterType.MOCKED)
6565
@SpringJUnitConfig(TransactionsConfig.class)
6666
public class TransactionTemplateIntegrationTests extends JavaIntegrationTests {
67-
TransactionTemplate template;
67+
@Autowired TransactionTemplate transactionTemplate;
6868
@Autowired CouchbaseCallbackTransactionManager transactionManager;
6969
@Autowired CouchbaseClientFactory couchbaseClientFactory;
7070
@Autowired CouchbaseTemplate ops;
@@ -86,8 +86,6 @@ public void beforeEachTest() {
8686
assertNotInTransaction();
8787
List<RemoveResult> rp0 = ops.removeByQuery(Person.class).withConsistency(REQUEST_PLUS).all();
8888
List<RemoveResult> rp1 = ops.removeByQuery(PersonWithoutVersion.class).withConsistency(REQUEST_PLUS).all();
89-
90-
template = new TransactionTemplate(transactionManager);
9189
}
9290

9391
@AfterEach
@@ -106,7 +104,7 @@ public RunResult(int attempts) {
106104
private RunResult doInTransaction(Consumer<TransactionStatus> lambda) {
107105
AtomicInteger tryCount = new AtomicInteger();
108106

109-
template.executeWithoutResult(status -> {
107+
transactionTemplate.executeWithoutResult(status -> {
110108
TransactionTestUtil.assertInTransaction();
111109
assertFalse(status.hasSavepoint());
112110
assertFalse(status.isRollbackOnly());
@@ -346,25 +344,26 @@ public void setRollbackOnly() {
346344
@DisplayName("Setting an unsupported isolation level should fail")
347345
@Test
348346
public void unsupportedIsolationLevel() {
349-
template.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
347+
transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
350348

351349
assertThrowsWithCause(() -> doInTransaction(status -> {}), IllegalArgumentException.class);
352350
}
353351

354352
@DisplayName("Setting PROPAGATION_MANDATORY should fail, as not in a transaction")
355353
@Test
356354
public void propagationMandatoryOutsideTransaction() {
357-
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
358-
355+
int propagation = transactionTemplate.getPropagationBehavior();
356+
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
359357
assertThrowsWithCause(() -> doInTransaction(status -> {}), IllegalTransactionStateException.class);
358+
transactionTemplate.setPropagationBehavior(propagation);
360359
}
361360

362361
@Test
363362
public void nestedTransactionTemplates() {
364363
TransactionTemplate template2 = new TransactionTemplate(transactionManager);
365364
template2.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
366365

367-
template.executeWithoutResult(status -> {
366+
transactionTemplate.executeWithoutResult(status -> {
368367
template2.executeWithoutResult(status2 -> {
369368
Person person = ops.insertById(Person.class).one(WalterWhite);
370369
});

src/test/java/org/springframework/data/couchbase/transactions/sdk/SDKReactiveTransactionsTemplateIntegrationTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,21 @@ public void committedInsert() {
126126
assertEquals(1, rr.attempts);
127127
}
128128

129+
private RunResult doInTransaction2(Function<ReactiveTransactionAttemptContext, Mono<?>> lambda,
130+
@Nullable TransactionOptions options) {
131+
AtomicInteger attempts = new AtomicInteger();
132+
133+
TransactionResult result = couchbaseClientFactory.getCluster().reactive().transactions().run(ctx -> {
134+
return TransactionalSupport.checkForTransactionInThreadLocalStorage().then(Mono.defer(() -> {
135+
return lambda.apply(ctx);
136+
}));
137+
}, options).block();
138+
139+
assertNotInTransaction();
140+
141+
return new RunResult(result, attempts.get());
142+
}
143+
129144
@DisplayName("A basic golden path replace should succeed")
130145
@Test
131146
public void committedReplace() {

0 commit comments

Comments
 (0)