聊聊claudb的transaction command
时间:2022-07-24
本文章向大家介绍聊聊claudb的transaction command,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下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("multi")
@TxIgnore
public class MultiCommand implements DBCommand {
private static final String TRASACTION_KEY = "tx";
@Override
public RedisToken execute(Database db, Request request) {
if (!isTxActive(request.getSession())) {
createTransaction(request.getSession());
return responseOk();
} else {
return error("ERR MULTI calls can not be nested");
}
}
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("exec")
@TxIgnore
public 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("ERR EXEC without MULTI");
}
}
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("tx");
}
}
- 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("discard")
@TxIgnore
public class DiscardCommand implements DBCommand {
private static final String TX_KEY = "tx";
@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
- Sublime text 3 中Package Control 的安装与使用方法
- 用functools.lru_cache实现Python的Memoization
- 腾讯互联网与社会研究院秘书长司晓:将联合开展研究合作
- 幻灯片jQuery插件Orbit 介绍(附添加到WordPress教程)
- Gravatar开发者手册
- Gravatar开发者手册
- 使用Google CDN服务提供的jQuery库
- 比特币的分叉币都认为能够取代比特币,事实真的是这样吗?
- Google官方网页载入速度检测工具PageSpeed Insights 使用教程
- ASP.NET 路由
- Kafka定时清除过期数据
- 腾讯高级副总裁郭凯天:打造腾讯智库分析互联网产业前沿问题
- Google Chrome 浏览器 开发者工具 使用教程
- 反向代理(Reverse Proxy)及 IIS 7 应用请求路由模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- apache tika检测文件是否损坏的方法
- Linux下二进制编译安装MySql centos7的教程
- Linux 6 修改ssh默认远程端口号的操作步骤
- 基于python的Linux系统指定进程性能监控思路详解
- ubuntu下的虚拟环境中安装Django的操作方法
- 详解linux下umask的使用
- Linux下设置每天自动备份数据库的方法
- Linux常用命令之chmod修改文件权限777和754
- 解决CentOS 7升级Python到3.6.6后yum出错问题总结
- Linux下如何挂载磁盘的方法示例
- centos7 PHP环境搭建 GD库 等插件安装方法
- CentOS服务器环境下MySQL主从同步配置方法
- awk命令
- linux下C语言实现写日志功能
- centOS7下Spark安装配置教程详解