当前位置: 首页 > article >正文

mydb:TM实现

一、说明

TM就是事务管理:实现对于事务的新增(active)、事务的状态修改(commit、abort)、事务的状态判断

二、事务管理

2.1创建xid文件/打开xid文件

创建xid、写一个空的 XID 文件头并创建TM

    public static TransactionManagerImpl create(String path) {
        //创建文件.xid
        File f = new File(path+TransactionManagerImpl.XID_SUFFIX);
        try {
            if(!f.createNewFile()) {
                Panic.panic(Error.FileExistsException);
            }
        } catch (Exception e) {
            Panic.panic(e);
        }
        if(!f.canRead() || !f.canWrite()) {
            Panic.panic(Error.FileCannotRWException);
        }

        //用于高效地处理文件的读取和写入操作
        FileChannel fc = null;
        //任意读文件
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(f, "rw");
            fc = raf.getChannel();
        } catch (FileNotFoundException e) {
           Panic.panic(e);
        }

        // 写空XID文件头
        ByteBuffer buf = ByteBuffer.wrap(new byte[TransactionManagerImpl.LEN_XID_HEADER_LENGTH]);
        try {
            //定位到指定位置
            fc.position(0);
            //进行写入
            fc.write(buf);
        } catch (IOException e) {
            Panic.panic(e);
        }
        
        return new TransactionManagerImpl(raf, fc);
    }

2.2 打开xid文件并创建TM

public static TransactionManagerImpl open(String path) {
        File f = new File(path+TransactionManagerImpl.XID_SUFFIX);
        if(!f.exists()) {
            Panic.panic(Error.FileNotExistsException);
        }
        if(!f.canRead() || !f.canWrite()) {
            Panic.panic(Error.FileCannotRWException);
        }

        FileChannel fc = null;
        RandomAccessFile raf = null;
        try {
            raf = new RandomAccessFile(f, "rw");
            fc = raf.getChannel();
        } catch (FileNotFoundException e) {
           Panic.panic(e);
        }

        return new TransactionManagerImpl(raf, fc);
    }

2.2 基于TM进行相关的事务处理

0. 检查文件是否合法 :利用 RandomAccessFile 文件长度 和  new io 的一个类 FileChannel

1、新增事务

新增字节、修改事务总数

2、修改事务状态

通过 updateXID()实现 updateXid是对指定位置写 如果没有直接写 如果有会覆盖

3、事务的状态判断

2.3 注意事项

这里的所有文件操作,在执行后都需要立刻刷入文件中,防止在崩溃后文件丢失数据,fileChannel 的 force() 方法,强制同步缓存内容到文件中,类似于 BIO 中的 flush() 方法。force 方法的参数是一个布尔,表示是否同步文件的元数据(例如最后修改时间等)。

每次写完会try  force() 方法。


http://www.kler.cn/a/543467.html

相关文章:

  • 【黑马点评】 使用RabbitMQ实现消息队列——3.批量获取1k个用户token,使用jmeter压力测试
  • 【JavaEE进阶】依赖注入 DI详解
  • 【IDEA】2017版本的使用
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • C# OpenCV机器视觉:模仿Halcon各向异性扩散滤波
  • 运用 LangChain 编排任务处理流水线,实现多轮对话场景
  • 微信小程序 - 组件和样式
  • 权重修剪(Pruning)和量化(Quantization)
  • AcWing 5166:对称山脉 ← 动态规划
  • 32单片机学习记录4之串口通信
  • 记一次HID报表描述符识别异常问题排查
  • 使用Docker部署MySQL 5.7并配置防火墙
  • C++,STL容器 unordered_set/unordered_multiset:无序集合/无序多重集合深入解析
  • 【面试集锦】如何设计SSO方案?和OAuth有什么区别?
  • JavaWeb学习-Mybatis(增删改查)
  • Windows 软件奔溃-dmp文件分析
  • 微信小程序网络请求封装
  • 【JavaEE进阶】Spring IoC
  • 【漫话机器学习系列】088.常见的输出层激活函数(Common Output Layer Activation Functions)
  • 堆、方法区、虚拟机栈、本地方法栈 和 程序计数器
  • HCIA项目实践--RIP相关原理知识面试问题总结回答
  • 从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)
  • Oracle数据库ADG日志丢失处理方法
  • js实现深拷贝
  • HDL Compiler:工具简介
  • C++病毒(^_^|)(2)