Fescar - RM AbstractDMLBaseExecutor介绍

简介: 开篇 这篇文章的目的是讲解RM Executor模块当中一些通用的方法,这些方法在各个Executor的父类当中实现的,各个子类Executor模块都会复用,因此抽取出来统一的进行讲解。 个人是认为抽取通用的内容放在一篇文章讲解完后可以针对每类Executor讲解特有的功能,这样能够有更好的理解。

开篇

 这篇文章的目的是讲解RM Executor模块当中一些通用的方法,这些方法在各个Executor的父类当中实现的,各个子类Executor模块都会复用,因此抽取出来统一的进行讲解。

 个人是认为抽取通用的内容放在一篇文章讲解完后可以针对每类Executor讲解特有的功能,这样能够有更好的理解。这篇文章讲解Executor的父类AbstractDMLBaseExecutor。


类依赖图


说明:

  • 着重讲解AbstractDMLBaseExecutor抽象父类。


AbstractDMLBaseExecutor方法介绍

public abstract class AbstractDMLBaseExecutor<T, S extends Statement> 
  extends BaseTransactionalExecutor<T, S> {

    public AbstractDMLBaseExecutor(StatementProxy<S> statementProxy, 
     StatementCallback<T, S> statementCallback, SQLRecognizer sqlRecognizer) {
        super(statementProxy, statementCallback, sqlRecognizer);
    }

    @Override
    public T doExecute(Object... args) throws Throwable {
        AbstractConnectionProxy connectionProxy = 
                     statementProxy.getConnectionProxy();
        if (connectionProxy.getAutoCommit()) {
            return executeAutoCommitTrue(args);
        } else {
            return executeAutoCommitFalse(args);
        }
    }
}

说明:

  • AbstractDMLBaseExecutor的doExecute内部执行事务操作。
  • executeAutoCommitTrue()执行事务自动提交的操作。
  • executeAutoCommitFalse()执行事务不自动提交的操作。


public abstract class AbstractDMLBaseExecutor<T, S extends Statement> 
  extends BaseTransactionalExecutor<T, S> {

    protected T executeAutoCommitFalse(Object[] args) throws Throwable {
        // 准备执行前镜像
        TableRecords beforeImage = beforeImage();

        // 执行事务,内部调用statement.execute执行
        T result = statementCallback.execute(
           statementProxy.getTargetStatement(), args);

        // 准备执行后镜像
        TableRecords afterImage = afterImage(beforeImage);

        // 准备回滚日志
        statementProxy.getConnectionProxy().prepareUndoLog(
             sqlRecognizer.getSQLType(), sqlRecognizer.getTableName(), 
             beforeImage, afterImage);

        return result;
    }

    protected T executeAutoCommitTrue(Object[] args) throws Throwable {
        T result = null;
        AbstractConnectionProxy connectionProxy = 
                       statementProxy.getConnectionProxy();
        LockRetryController lockRetryController = new LockRetryController();
        try {
            connectionProxy.setAutoCommit(false);
            while (true) {
                try {
                    result = executeAutoCommitFalse(args);
                    connectionProxy.commit();
                    break;
                } catch (LockConflictException lockConflict) {
                    lockRetryController.sleep(lockConflict);
                }
            }

        } catch (Exception e) {
            throw e;
        } finally {
            connectionProxy.setAutoCommit(true);
        }
        return result;
    }

    protected abstract TableRecords beforeImage() throws SQLException;

    protected abstract TableRecords afterImage(TableRecords beforeImage) 
       throws SQLException;

}

说明:

  • 自动提交内部executeAutoCommitTrue调用的非自动提交executeAutoCommitFalse。
  • executeAutoCommitFalse按照准备执行前镜像、执行本地事务、准备执行后镜像,准备回滚日志。
  • statementCallback.execute最终执行StatementProxy和PreparedStatementProxy的statement.execute()完成事务操作。
  • statementProxy.getConnectionProxy().prepareUndoLog()负责准备回滚日志。


期待

 后续我们会将几类Executor的beforeImage()和afterImage()方法进行详细讲解。

目录
相关文章
|
3月前
|
JSON 缓存 物联网
天气预报查询 API 接口指南:当前 24 小时、未来 7/15 天与历史天气数据接入教程
阿里云天气预报查询API,覆盖全国3000+城市,支持地名、编码、IP、经纬度等6种定位方式,提供实时、24小时、7/15天预报及2011年起历史天气数据。高稳定、高并发、按次计费(失败不扣费),含100次免费试用,适配电商、车联网、能源、农业等多场景。
1599 0
|
5月前
|
数据采集 文字识别 监控
RPA 自动化能做什么?2026 办公 / 财务 / 电商全场景落地清单
2026年RPA能做什么?本文从办公自动化、财务RPA场景、电商RPA应用三个维度,拆解了会议纪要自动整理、发票OCR验真、银行流水抓取、税务申报自动化、竞品价格监控、库存同步预警等13个全流程落地场景。涵盖低代码RPA工具选型、EXE打包分发、内网离线部署等关键能力。适合中小企业技术负责人和RPA实施团队参考。
1005 0
RPA 自动化能做什么?2026 办公 / 财务 / 电商全场景落地清单
|
5月前
|
缓存 弹性计算 应用服务中间件
高端网站搭建:Nginx 反向代理与动静分离架构配置详解
在现代企业级 Web 架构中,Nginx 凭借其极低的内存消耗和超强的高并发处理能力,成为了不可或缺的流量网关。特别是在阿里云 ECS 实例搭配 Alibaba Cloud Linux 3 的环境下,Nginx 能够充分利用操作系统的网络栈优化,实现惊人的吞吐量。 本文将详细介绍如何配置 Nginx 的反向代理与动静分离,将静态资源请求与动态接口请求完美剥离,从而大幅提升网站的整体响应速度。
|
5月前
|
安全 Java 调度
【Java并发编程】线程生命周期、线程创建的4种方式(附《思维导图》+《面试高频考点清单》)
本资料系统梳理Java并发核心:涵盖线程5大生命周期状态(NEW→RUNNABLE→BLOCKED/WAITING/TIMED_WAITING→TERMINATED)及精准转换条件;详解4种线程创建方式(Thread继承、Runnable、Callable+Future、线程池),突出生产首选线程池的底层优势与选型逻辑,直击面试高频考点。
|
5月前
|
人工智能 JSON 安全
OpenClaw接入飞书保姆级教程,几分钟搞定手机养龙虾!
大家好,我是程序员鱼皮。 最近 OpenClaw 爆火,之前鱼皮已经出了 《保姆级小龙虾安装教程》,帮大家搞到了自己的小龙虾 🦞,还接入了 QQ,随时随地在手机上跟 AI 对话: 不过 QQ 毕竟偏个人社交,很多同学日常办公用的是飞书,纷纷来问我:鱼皮,飞书能不能也接上? 必须安排! OpenClaw 本身就支持各种第三方渠道,QQ、飞书、企微、Discord 都能接。 这篇文章,我来手把手教大
725 0
|
6月前
|
人工智能 自然语言处理 机器人
从代码到产品,Solo 独立开发者社区正在见证 AI 时代的新机会
Solo独立开发者社区(solo.xin)是中国聚焦独立开发者、AI Builder与技术创作者的垂直平台。它不止于技术交流,更覆盖产品展示、开发者主页、群组协作、内容沉淀、活动发布及商业化支持(如“Solo计划”),助力开发者完成从想法→产品→反馈→变现的全链路成长。链接真实人、真实产品与真实增长。
|
7月前
|
前端开发 JavaScript Java
异步非阻塞的三种实现 —— 回调、Promises 和协程
在I/O密集型系统中,传统的同步阻塞模型浪费大量线程等待资源。异步非阻塞允许单线程处理数千并发连接。三种语言对异步的支持处于不同阶段。
346 0
|
算法 数据安全/隐私保护
【密码学】一文读懂SHA-1
SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
2506 1
【密码学】一文读懂SHA-1
|
数据采集 固态存储
全国气象站点日值数据(降雨气温风速日照蒸发气压地温湿度)
全国气象站点日值数据(降雨气温风速日照蒸发气压地温湿度)
全国气象站点日值数据(降雨气温风速日照蒸发气压地温湿度)