I am trying to add transaction support to an existing dynamodb storage which looks like this:

public interface Storage<T>{
T put(T entity);
...
}

public abstract class AbstractDynamoStorage<T> implements Storage<T> {
@Override
public T put(T entity) {
...
}
}

public class DynamoOrderStorage extends AbstractDynamoStorage<CoreOrder> {
...
}

public class DynamoCustomerStorage extends AbstractDynamoStorage<CoreCustomer> {
...
}

Now, I want to add transaction support to this using the newly launched DDB transactions to be able to commit multiple operations(put, write, update..) across multiple tables.

Here's my approach:

interface TransactDAO{
void commitWriteTransaction(TransactWriteRequest writeReq);
}

class DynamoTransactImpl implements TransactDAO{
@Override:
commitWriteTransaction(TransactWriteRequest request){
//dynamodb.transactWriteItems();
}
}

class DynamoDBTransactWriteItem implements TransactWriteRequest{
List<DynamoTransactWriteItem<T>> transactWriteItems;
}

class DynamoTransactWritePutItem<T> implements DynamoTransactionWriteItem<T>{
String tableName;
String data;
...
}

My worry is that the concrete storage classes(DynamoOrderStorage and DynamoCustomerStorage) are of different type and my approach might not work here. Is there any other better way to achieve this?

0 Answers