聊聊claudb的transaction command

2020-09-03 碼匠亂燉

本文主要研究一下claudb的transaction command



TransactionState

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(); }}

  • TransactionState實現了Iterable<Request>接口,它定義了requests屬性,提供了enqueue方法將request添加到requests中

MultiCommand

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(); }}

  • MultiCommand實現了DBCommand接口,其execute方法先判斷isTxActive,非active的話才createTransaction

ExecCommand

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;); }}

  • ExecCommand實現了DBCommand接口,其execute方法先通過getTransactionIfExists獲取transaction,若transaction不存在則報錯,存在的話則遍歷transaction的queuedRequest,挨個執行executeCommand(server, queuedRequest)

DiscardCommand

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); }}

  • DiscardCommand實現了DBCommand接口,其execute方法執行removeTransactionIfExists(request.getSession())

小結

claudb transaction相關的command有MultiCommand、ExecCommand、DiscardCommand

doc

  • transaction

相關焦點

  • 聊聊claudb的set command
    序本文主要研究一下claudb的set command-1.7.1/src/main/java/com/github/tonivade/claudb/command/set/SetAddCommand.java@Command(&34;)@ParamLength(2)@ParamType(DataType.SET)public
  • 聊聊claudb的hash command
    序本文主要研究一下claudb的hash command-1.7.1/src/main/java/com/github/tonivade/claudb/command/hash/HashSetCommand.java@Command(&34;)@ParamLength(3)@ParamType(DataType.HASH)
  • 聊聊claudb的keys command
    序本文主要研究一下claudb的keys command-1.7.1/src/main/java/com/github/tonivade/claudb/command/key/KeysCommand.java@ReadOnly@Command(&34;)@ParamLength(1)public class KeysCommand
  • 聊聊claudb的list command
    序本文主要研究一下claudb的list command-1.7.1/src/main/java/com/github/tonivade/claudb/command/list/LeftPushCommand.java@Command(&34;)@ParamLength(2)@ParamType(DataType.LIST
  • 聊聊claudb的server command
    序本文主要研究一下claudb的server command-1.7.1/src/main/java/com/github/tonivade/claudb/command/server/SelectCommand.java@ReadOnly@Command(&34;)@ParamLength(1)public class SelectCommand
  • 聊聊claudb的string command
    序本文主要研究一下claudb的string command-1.7.1/src/main/java/com/github/tonivade/claudb/command/string/GetCommand.java@ReadOnly@Command(&34;)@ParamLength(1)@ParamType(DataType.STRING
  • 聊聊claudb的scripting command
    序本文主要研究一下claudb的scripting command-1.7.1/src/main/java/com/github/tonivade/claudb/command/scripting/AbstractEvalCommand.javaabstract class AbstractEvalCommand implements
  • 聊聊claudb的pubsub command
    序本文主要研究一下claudb的pubsub command-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PublishCommand.java@Command(&34;)@ParamLength(2)public class PublishCommand
  • 聊聊claudb的zset command
    -1.7.1/src/main/java/com/github/tonivade/claudb/command/zset/SortedSetAddCommand.java@Command(&34;)@ParamLength(3)@ParamType(DataType.ZSET
  • 聊聊claudb的MasterReplication
    );createCommands先添加ping命令,然後再添加commandsToReplicate;commandsToReplicate方法遍歷server.getCommandsToReplicate(),遇到array方法時先添加select命令,再添加command命令,最後返回commands
  • 聊聊claudb的SlaveReplication
    序本文主要研究一下claudb的SlaveReplication-1.7.1/src/main/java/com/github/tonivade/claudb/command/DBCommandProcessor.javapublic class DBCommandProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(DBCommandProcessor.class
  • 聊聊claudb的NotificationManager
    序本文主要研究一下claudb的NotificationManagerNotificationManagerclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PatternSubscriptionSupport.javapublic interface PatternSubscriptionSupport extends BaseSubscriptionSupport { String PSUBSCRIPTION_PREFIX
  • 聊聊claudb的Database
    序本文主要研究一下claudb的DatabaseDatabaseclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/data/Database.javapublic interface Database {​ int size();​ boolean isEmpty();​ boolean
  • 聊聊claudb的DatabaseCleaner
    序本文主要研究一下claudb的DatabaseCleaner-1.7.1/src/main/java/com/github/tonivade/claudb/data/DatabaseCleaner.javapublic class DatabaseCleaner {​ private static final Logger
  • 聊聊claudb的importRDB
    序本文主要研究一下claudb的importRDBimportRDBclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/DBServerState.javapublic class DBServerState {​ //......​
  • 聊聊claudb的exportRDB
    序本文主要研究一下claudb的exportRDBexportRDBclaudb-1.7.1/src/main/java/com/github/tonivade/claudb/DBServerState.javapublic class DBServerState {​ //......​
  • START TRANSACTION 中文man頁面
    如果聲明了隔離級別或者讀寫模式, 那麼新事務就使用這個特性,如同執行了 SET TRANSACTION [set_transaction(7)] 一樣。在其它方面,這條命令的行為和 BEGIN [begin(7)] 命令一樣。 PARAMETERS 參數 參閱 SET TRANSACTION [set_transaction(7)] 獲取有關參數含義的信息。
  • 中英對照:What is an OTC transaction
    新東方網>英語>英語學習>行業英語>金融英語>正文中英對照:What is an OTC transaction 2012-10-28 21:57 來源:外語教育網 作者:
  • 數據系統 - Transaction的處理和分析?
    隨著資料庫擴展到非金錢交易的領域,雖然術語transaction仍然沒發生什麼變化,但它實際指的是構成邏輯單元的一組讀取和寫入。Transaction不一定具有ACID(原子性,一致性,隔離性和持久性)屬性。
  • Intelligent command platform ensures fire control and...
    Recently, Nanning Fire Rescue Detachment has built an upgraded intelligent command platform for fire control at three levels, i.e. core area, alert area and social side