|
|
|
@ -88,8 +88,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
.flatMap(connection -> TransactionSynchronizationManager.forCurrentTransaction() |
|
|
|
.flatMap(connection -> TransactionSynchronizationManager.forCurrentTransaction() |
|
|
|
.doOnNext(synchronizationManager -> synchronizationManager.registerSynchronization( |
|
|
|
.doOnNext(synchronizationManager -> synchronizationManager.registerSynchronization(sync))) |
|
|
|
sync))) |
|
|
|
|
|
|
|
.as(operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectNextCount(1) |
|
|
|
.expectNextCount(1) |
|
|
|
@ -120,12 +119,11 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock).as( |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectErrorSatisfies(actual -> assertThat(actual).isInstanceOf( |
|
|
|
.expectErrorSatisfies(actual -> assertThat(actual).isInstanceOf( |
|
|
|
CannotCreateTransactionException.class).hasCauseInstanceOf( |
|
|
|
CannotCreateTransactionException.class).hasCauseInstanceOf(R2dbcBadGrammarException.class)) |
|
|
|
R2dbcBadGrammarException.class)) |
|
|
|
|
|
|
|
.verify(); |
|
|
|
.verify(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -141,8 +139,8 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock).as( |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectNextCount(1) |
|
|
|
.expectNextCount(1) |
|
|
|
.verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
@ -171,8 +169,8 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock).as( |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectNextCount(1) |
|
|
|
.expectNextCount(1) |
|
|
|
.verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
@ -190,8 +188,8 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock).as( |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectNextCount(1) |
|
|
|
.expectNextCount(1) |
|
|
|
.verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
@ -215,8 +213,8 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock).as( |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
operator::transactional) |
|
|
|
.as(operator::transactional) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.as(StepVerifier::create) |
|
|
|
.expectNextCount(1) |
|
|
|
.expectNextCount(1) |
|
|
|
.verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
@ -262,11 +260,9 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm); |
|
|
|
|
|
|
|
|
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
.doOnNext(connection -> { |
|
|
|
.doOnNext(connection -> { throw new IllegalStateException(); }) |
|
|
|
throw new IllegalStateException(); |
|
|
|
.as(operator::transactional) |
|
|
|
}).as(operator::transactional) |
|
|
|
.as(StepVerifier::create).verifyError(IllegalStateException.class); |
|
|
|
.as(StepVerifier::create) |
|
|
|
|
|
|
|
.verifyError(IllegalStateException.class); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThat(commits).hasValue(0); |
|
|
|
assertThat(commits).hasValue(0); |
|
|
|
assertThat(rollbacks).hasValue(1); |
|
|
|
assertThat(rollbacks).hasValue(1); |
|
|
|
@ -286,8 +282,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
reactiveTransaction.setRollbackOnly(); |
|
|
|
reactiveTransaction.setRollbackOnly(); |
|
|
|
return ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
return ConnectionFactoryUtils.getConnection(connectionFactoryMock) |
|
|
|
.doOnNext(connection -> connection.createStatement("foo")).then(); |
|
|
|
.doOnNext(connection -> connection.createStatement("foo")).then(); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyError(BadSqlGrammarException.class); |
|
|
|
.verifyError(BadSqlGrammarException.class); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).beginTransaction(any(io.r2dbc.spi.TransactionDefinition.class)); |
|
|
|
verify(connectionMock).beginTransaction(any(io.r2dbc.spi.TransactionDefinition.class)); |
|
|
|
verify(connectionMock).createStatement("foo"); |
|
|
|
verify(connectionMock).createStatement("foo"); |
|
|
|
@ -308,7 +303,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
.doOnNext(connection -> { |
|
|
|
.doOnNext(connection -> { |
|
|
|
throw new IllegalStateException("Intentional error to trigger rollback"); |
|
|
|
throw new IllegalStateException("Intentional error to trigger rollback"); |
|
|
|
}).then()).as(StepVerifier::create) |
|
|
|
}).then()).as(StepVerifier::create) |
|
|
|
.verifyErrorSatisfies(e -> assertThat(e) |
|
|
|
.verifyErrorSatisfies(ex -> assertThat(ex) |
|
|
|
.isInstanceOf(BadSqlGrammarException.class) |
|
|
|
.isInstanceOf(BadSqlGrammarException.class) |
|
|
|
.hasCause(new R2dbcBadGrammarException("Rollback should fail")) |
|
|
|
.hasCause(new R2dbcBadGrammarException("Rollback should fail")) |
|
|
|
); |
|
|
|
); |
|
|
|
@ -334,8 +329,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
assertThat(synchronizationManager.hasResource(connectionFactoryMock)).isTrue(); |
|
|
|
assertThat(synchronizationManager.hasResource(connectionFactoryMock)).isTrue(); |
|
|
|
synchronizationManager.registerSynchronization(sync); |
|
|
|
synchronizationManager.registerSynchronization(sync); |
|
|
|
}).then(); |
|
|
|
}).then(); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).beginTransaction(any(io.r2dbc.spi.TransactionDefinition.class)); |
|
|
|
verify(connectionMock).beginTransaction(any(io.r2dbc.spi.TransactionDefinition.class)); |
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
@ -363,8 +357,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
fail("Should have thrown IllegalTransactionStateException"); |
|
|
|
fail("Should have thrown IllegalTransactionStateException"); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyError(IllegalTransactionStateException.class); |
|
|
|
.verifyError(IllegalTransactionStateException.class); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
@ -381,14 +374,13 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
operator.execute(tx1 -> { |
|
|
|
operator.execute(tx1 -> { |
|
|
|
assertThat(tx1.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx1.isNewTransaction()).isTrue(); |
|
|
|
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
return operator.execute(tx2 -> { |
|
|
|
return operator.execute(tx2 -> { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).releaseSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).releaseSavepoint("SAVEPOINT_1"); |
|
|
|
@ -407,15 +399,14 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
operator.execute(tx1 -> { |
|
|
|
operator.execute(tx1 -> { |
|
|
|
assertThat(tx1.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx1.isNewTransaction()).isTrue(); |
|
|
|
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
return operator.execute(tx2 -> { |
|
|
|
return operator.execute(tx2 -> { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).createSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_1"); |
|
|
|
verify(connectionMock).rollbackTransactionToSavepoint("SAVEPOINT_1"); |
|
|
|
@ -432,16 +423,15 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
operator.execute(tx1 -> { |
|
|
|
operator.execute(tx1 -> { |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).commitTransaction(); |
|
|
|
verify(connectionMock).commitTransaction(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
@ -456,17 +446,16 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
operator.execute(tx1 -> { |
|
|
|
operator.execute(tx1 -> { |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
@ -489,8 +478,7 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).commitTransaction(); |
|
|
|
verify(connectionMock).commitTransaction(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
@ -505,17 +493,16 @@ class R2dbcTransactionManagerUnitTests { |
|
|
|
|
|
|
|
|
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
TransactionalOperator operator = TransactionalOperator.create(tm, definition); |
|
|
|
operator.execute(tx1 -> { |
|
|
|
operator.execute(tx1 -> { |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
assertThat(tx1.isNewTransaction()).isFalse(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
DefaultTransactionDefinition innerDef = new DefaultTransactionDefinition(); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); |
|
|
|
innerDef.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
TransactionalOperator inner = TransactionalOperator.create(tm, innerDef); |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
return inner.execute(tx2 -> { |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
assertThat(tx2.isNewTransaction()).isTrue(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
tx2.setRollbackOnly(); |
|
|
|
return Mono.empty(); |
|
|
|
return Mono.empty(); |
|
|
|
}); |
|
|
|
}); |
|
|
|
}).as(StepVerifier::create) |
|
|
|
}).as(StepVerifier::create).verifyComplete(); |
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).rollbackTransaction(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
verify(connectionMock).close(); |
|
|
|
|