本文主要研究一下claudb的transaction command
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/TransactionState.java
public class TransactionState implements Iterable<Request> { private List<Request> requests = new LinkedList<>(); public void enqueue(Request request) { requests.add(request); } public int size() { return requests.size(); } @Override public Iterator<Request> iterator() { return requests.iterator(); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/transaction/MultiCommand.java
@Command(&34;)@TxIgnorepublic class MultiCommand implements DBCommand { private static final String TRASACTION_KEY = &34;; @Override public RedisToken execute(Database db, Request request) { if (!isTxActive(request.getSession())) { createTransaction(request.getSession()); return responseOk(); } else { return error(&34;); } } private void createTransaction(Session session) { session.putValue(TRASACTION_KEY, new TransactionState()); } private boolean isTxActive(Session session) { return session.getValue(TRASACTION_KEY).isPresent(); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/transaction/ExecCommand.java
@Command(&34;)@TxIgnorepublic class ExecCommand implements DBCommand { @Override public RedisToken execute(Database db, Request request) { Option<TransactionState> transaction = getTransactionIfExists(request.getSession()); if (transaction.isPresent()) { DBServerContext server = getClauDB(request.getServerContext()); List<RedisToken> responses = new ArrayList<>(); for (Request queuedRequest : transaction.get()) { responses.add(executeCommand(server, queuedRequest)); } return RedisToken.array(responses); } else { return RedisToken.error(&34;); } } private RedisToken executeCommand(DBServerContext server, Request queuedRequest) { RespCommand command = server.getCommand(queuedRequest.getCommand()); return command.execute(queuedRequest); } private Option<TransactionState> getTransactionIfExists(Session session) { return session.removeValue(&34;); }}
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/transaction/DiscardCommand.java
@Command(&34;)@TxIgnorepublic class DiscardCommand implements DBCommand { private static final String TX_KEY = &34;; @Override public RedisToken execute(Database db, Request request) { removeTransactionIfExists(request.getSession()); return RedisToken.responseOk(); } private Option<TransactionState> removeTransactionIfExists(Session session) { return session.removeValue(TX_KEY); }}
claudb transaction相關的command有MultiCommand、ExecCommand、DiscardCommand