use of com.scalar.db.transaction.rpc.GrpcTwoPhaseCommitTransaction in project scalardb by scalar-labs.
the class TwoPhaseCommitTransactionServiceWithTwoPhaseConsensusCommitWithExtraReadIntegrationTest method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraRead_OneShouldCommitTheOtherShouldThrowValidationException.
@Test
public void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraRead_OneShouldCommitTheOtherShouldThrowValidationException() throws TransactionException {
// Arrange
// Act
GrpcTwoPhaseCommitTransaction tx1Sub1 = manager.start();
GrpcTwoPhaseCommitTransaction tx1Sub2 = manager.join(tx1Sub1.getId());
Optional<Result> result = tx1Sub2.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
int current1 = 0;
tx1Sub1.get(prepareGet(0, 0, TABLE_1));
tx1Sub1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, current1 + 1));
GrpcTwoPhaseCommitTransaction tx2Sub1 = manager.start();
GrpcTwoPhaseCommitTransaction tx2Sub2 = manager.join(tx2Sub1.getId());
result = tx2Sub1.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
int current2 = 0;
tx2Sub2.get(prepareGet(1, 0, TABLE_2));
tx2Sub2.put(preparePut(1, 0, TABLE_2).withValue(BALANCE, current2 + 1));
tx1Sub1.prepare();
tx1Sub2.prepare();
tx1Sub1.validate();
tx1Sub2.validate();
tx1Sub1.commit();
tx1Sub2.commit();
tx2Sub1.prepare();
tx2Sub2.prepare();
assertThatThrownBy(() -> {
tx2Sub1.validate();
tx2Sub2.validate();
}).isInstanceOf(ValidationException.class);
tx2Sub1.rollback();
tx2Sub2.rollback();
// Assert
GrpcTwoPhaseCommitTransaction transaction = manager.start();
result = transaction.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isPresent();
assertThat(getBalance(result.get())).isEqualTo(current1 + 1);
result = transaction.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isNotPresent();
transaction.prepare();
transaction.validate();
transaction.commit();
}
Aggregations