use of com.scalar.db.api.Result in project scalardb by scalar-labs.
the class TwoPhaseCommitTransactionServiceWithTwoPhaseConsensusCommitWithExtraWriteIntegrationTest method commit_WriteSkewWithScanOnNonExistingRecordsWithSerializableWithExtraWrite_ShouldThrowPreparationException.
@Test
public void commit_WriteSkewWithScanOnNonExistingRecordsWithSerializableWithExtraWrite_ShouldThrowPreparationException() throws TransactionException {
// Arrange
// Act Assert
GrpcTwoPhaseCommitTransaction transaction1 = manager.start();
List<Result> results = transaction1.scan(prepareScan(0, 0, 1, TABLE_1));
assertThat(results).isEmpty();
int count1 = 0;
transaction1.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, count1 + 1));
GrpcTwoPhaseCommitTransaction transaction2 = manager.start();
results = transaction2.scan(prepareScan(0, 0, 1, TABLE_1));
assertThat(results).isEmpty();
int count2 = 0;
transaction2.put(preparePut(0, 1, TABLE_1).withValue(BALANCE, count2 + 1));
assertThatThrownBy(transaction1::prepare).isInstanceOf(PreparationException.class);
transaction1.rollback();
assertThatThrownBy(transaction2::prepare).isInstanceOf(PreparationException.class);
transaction2.rollback();
// Assert
GrpcTwoPhaseCommitTransaction transaction = manager.start();
Optional<Result> result = transaction.get(prepareGet(0, 0, TABLE_1));
assertThat(result).isNotPresent();
result = transaction.get(prepareGet(0, 1, TABLE_1));
assertThat(result).isNotPresent();
transaction.prepare();
transaction.commit();
}
use of com.scalar.db.api.Result in project scalardb by scalar-labs.
the class TwoPhaseCommitTransactionServiceWithTwoPhaseConsensusCommitWithExtraWriteIntegrationTest method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowPreparationException.
@Test
public void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowPreparationException() throws TransactionException {
// Arrange
// Act Assert
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.commit();
tx1Sub2.commit();
assertThatThrownBy(() -> {
tx2Sub1.prepare();
tx2Sub2.prepare();
}).isInstanceOf(PreparationException.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.commit();
}
use of com.scalar.db.api.Result in project scalardb by scalar-labs.
the class TwoPhaseCommitTransactionServiceWithTwoPhaseConsensusCommitWithExtraWriteIntegrationTest method commit_WriteSkewOnExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowPreparationException.
@Test
public void commit_WriteSkewOnExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowPreparationException() throws TransactionException {
// Arrange
GrpcTwoPhaseCommitTransaction transaction = manager.start();
transaction.put(preparePut(0, 0, TABLE_1).withValue(BALANCE, 1));
transaction.put(preparePut(1, 0, TABLE_2).withValue(BALANCE, 1));
transaction.prepare();
transaction.commit();
// Act Assert
GrpcTwoPhaseCommitTransaction tx1Sub1 = manager.start();
GrpcTwoPhaseCommitTransaction tx1Sub2 = manager.join(tx1Sub1.getId());
Optional<Result> result = tx1Sub2.get(prepareGet(1, 0, TABLE_2));
assertThat(result).isPresent();
int current1 = getBalance(result.get());
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).isPresent();
int current2 = getBalance(result.get());
tx2Sub2.get(prepareGet(1, 0, TABLE_2));
tx2Sub2.put(preparePut(1, 0, TABLE_2).withValue(BALANCE, current2 + 1));
tx1Sub1.prepare();
tx1Sub2.prepare();
tx1Sub1.commit();
tx1Sub2.commit();
assertThatThrownBy(() -> {
tx2Sub1.prepare();
tx2Sub2.prepare();
}).isInstanceOf(PreparationException.class);
tx2Sub1.rollback();
tx2Sub2.rollback();
// Assert
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).isPresent();
assertThat(getBalance(result.get())).isEqualTo(current2);
transaction.prepare();
transaction.commit();
}
use of com.scalar.db.api.Result in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithConsensusCommitWithExtraWriteIntegrationTest method commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowCommitConflictException.
private void commit_WriteSkewOnNonExistingRecordsWithSerializableWithExtraWrite_OneShouldCommitTheOtherShouldThrowCommitConflictException(String table1, String table2) throws TransactionException {
// Arrange
// no records
// Act
GrpcTransaction transaction1 = manager.start();
GrpcTransaction transaction2 = manager.start();
Get get1_1 = prepareGet(0, 1, table2);
Optional<Result> result1 = transaction1.get(get1_1);
Get get1_2 = prepareGet(0, 0, table1);
transaction1.get(get1_2);
int current1 = 0;
Get get2_1 = prepareGet(0, 0, table1);
Optional<Result> result2 = transaction2.get(get2_1);
Get get2_2 = prepareGet(0, 1, table2);
transaction2.get(get2_2);
int current2 = 0;
Put put1 = preparePut(0, 0, table1).withValue(BALANCE, current1 + 1);
transaction1.put(put1);
Put put2 = preparePut(0, 1, table2).withValue(BALANCE, current2 + 1);
transaction2.put(put2);
Throwable thrown1 = catchThrowable(transaction1::commit);
Throwable thrown2 = catchThrowable(transaction2::commit);
// Assert
assertThat(result1.isPresent()).isFalse();
assertThat(result2.isPresent()).isFalse();
GrpcTransaction transaction = manager.start();
result1 = transaction.get(get1_1);
result2 = transaction.get(get2_1);
transaction.commit();
assertThat(result1.isPresent()).isFalse();
assertThat(result2).isPresent();
assertThat(getBalance(result2.get())).isEqualTo(1);
assertThat(thrown1).doesNotThrowAnyException();
assertThat(thrown2).isInstanceOf(CommitConflictException.class);
}
use of com.scalar.db.api.Result in project scalardb by scalar-labs.
the class DistributedTransactionServiceWithJdbcTransactionIntegrationTest method commit_DeleteGivenForExistingAfterRead_ShouldDeleteRecord.
@Test
public void commit_DeleteGivenForExistingAfterRead_ShouldDeleteRecord() throws TransactionException {
// Arrange
populateRecords();
Get get = prepareGet(0, 0, NAMESPACE, TABLE);
Delete delete = prepareDelete(0, 0, NAMESPACE, TABLE);
GrpcTransaction transaction = manager.start();
// Act
Optional<Result> result = transaction.get(get);
transaction.delete(delete);
transaction.commit();
// Assert
assertThat(result.isPresent()).isTrue();
GrpcTransaction another = manager.start();
Optional<Result> result1 = another.get(get);
another.commit();
assertThat(result1.isPresent()).isFalse();
}
Aggregations