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

【MyDB】4-VersionManager 之 4-VM的实现

【MyDB】4-VersionManager 之 4-VM的实现

  • VM 的实现
    • VM(VersionManager)的基本定义与实现优化
    • 具体功能实现
      • begin()开启事务
      • commit()提交事务
      • abort 中止事务
      • read 读取uid对应的数据记录所在的entry
      • insert方法,插入数据
      • delete方法

VM 的实现

本章代码位于:top/xianghua/mydb/server/vm/VersionManagerImpl.java

top/xianghua/mydb/server/vm/VersionManager.java

VM(VersionManager)的基本定义与实现优化

接下来,在介绍完了VM所依赖的记录版本,事务隔离以及死锁检测后,我们来到了最终VersionManager的实现。

VM 层通过 VersionManager 接口,向上层提供用于管理事务和数据操作的基本功能。包括事务的开始,提交,回滚以及数据的插入,读取和删除,VersionManager的基本定义如下:

public interface VersionManager {byte[] read(long xid, long uid) throws Exception;long insert(long xid, byte[] data) throws Exception;boolean delete(long xid, long uid) throws Exception;long begin(int level);void commit(long xid) throws Exception;void abort(long xid);
}

同时,VM 的实现类还被设计为 Entry 的缓存,需要继承 AbstractCache<Entry>。需要实现的获取到缓存和从缓存释放的方法很简单:

@Override
protected Entry getForCache(long uid) throws Exception {Entry entry = Entry.loadEntry(this, uid);if(entry == null) {throw Error.NullEntryException;}return entry;
}@Override
protected void releaseForCache(Entry entry) {entry.remove();
}

具体功能实现

begin()开启事务

begin() 开启一个事务,并初始化事务的结构,将其存放在 activeTransaction 中,用于检查和快照使用:

    @Override/*** 根据传入的隔离级别开启一个事务* level:0表示读已提交,1表示可重复读*/public long begin(int level) {lock.lock();try {long xid = tm.begin(); // 事务管理器开启一个事务,返回一个xidTransaction t = Transaction.newTransaction(xid, level, activeTransaction); // 创建一个事务对象activeTransaction.put(xid, t); // 将事务对象放入活跃事务集合中return xid; // 返回事务id} finally {lock.unlock();}}

commit()提交事务

commit() 方法提交一个事务,主要就是 free 掉相关的结构,并且释放持有的锁,并修改 TM 状态:

  1. 获取事务对象

  2. 将事务对象从活跃事务集合中移除

  3. 从LockTable中释放该事务占用的资源,并提交事务

    /*** 提交事务* @param xid* @throws Exception*/@Overridepublic void commit(long xid) throws Exception {// 1. 获取事务对象lock.lock();Transaction t = activeTransaction.get(xid); // 获取事务对象lock.unlock();try {if(t.err != null) {throw t.err;}} catch(NullPointerException n) {System.out.println(xid);System.out.println(activeTransaction.keySet());Panic.panic(n);}// 2. 将事务对象从活跃事务集合中移除lock.lock();activeTransaction.remove(xid); // 将事务对象从活跃事务集合中移除lock.unlock();// 3. 从LockTable中释放该事务占用的资源,并提交事务lt.remove(xid); // 将事务对象从LockTable中移除tm.commit(xid); // 事务管理器提交事务}

abort 中止事务

abort 事务的方法则有两种,手动和自动。手动指的是调用 abort() 方法,而自动,则是在事务被检测出出现死锁时,会自动撤销回滚事务;或者出现版本跳跃时,也会自动回滚:

  1. 从activeTransaction中根据xid获取事务对象
  2. 从LockTable中释放该事务占用的资源,并调用事务管理器终止事务
    @Overridepublic void abort(long xid) {internAbort(xid, false);}private void internAbort(long xid, boolean autoAborted) {lock.lock();Transaction t = activeTransaction.get(xid);if(!autoAborted) {activeTransaction.remove(xid);}lock.unlock();if(t.autoAborted) return;lt.remove(xid);tm.abort(xid);
}

read 读取uid对应的数据记录所在的entry

read() 方法读取一个 entry,注意判断下可见性即可:

    /*** 读取数据* @param xid* @param uid* @return* @throws Exception*/@Overridepublic byte[] read(long xid, long uid) throws Exception {// 1. 获取事务对象lock.lock();Transaction t = activeTransaction.get(xid);lock.unlock();if(t.err != null) {throw t.err;}// 2. 尝试从缓存中获取对应的entryEntry entry = null;try {entry = super.get(uid);} catch(Exception e) {if(e == Error.NullEntryException) {return null;} else {throw e;}}// 3. 判断事务是否可见try {if(Visibility.isVisible(tm, t, entry)) {return entry.data();} else {return null;}} finally {entry.release();}}

insert方法,插入数据

insert() 则是将数据包裹成 Entry,无脑交给 DM 插入即可:

@Override
public long insert(long xid, byte[] data) throws Exception {lock.lock();Transaction t = activeTransaction.get(xid);lock.unlock();if(t.err != null) {throw t.err;}byte[] raw = Entry.wrapEntryRaw(xid, data);return dm.insert(xid, raw);
}

delete方法

delete() 方法看起来略为复杂:

在这里插入图片描述

    @Overridepublic boolean delete(long xid, long uid) throws Exception {// 1. 获取事务对象lock.lock();Transaction t = activeTransaction.get(xid);lock.unlock();// 2. 尝试从缓存中获取对应的entryif(t.err != null) {throw t.err;}Entry entry = null;try {entry = super.get(uid);} catch(Exception e) {if(e == Error.NullEntryException) {return false;} else {throw e;}}// 3. 判断事务是否可见try {// 3.1 如果事务不可见,则返回falseif(!Visibility.isVisible(tm, t, entry)) {return false;}// 3.2 如果事务可见,则尝试获取锁Lock l = null;try {// 尝试获取指定 xid 和 uid 的锁l = lt.add(xid, uid);} catch(Exception e) {// 如果加锁失败,则抛出异常,并回滚事务t.err = Error.ConcurrentUpdateException;internAbort(xid, true);t.autoAborted = true;throw t.err;}// 3.3 如果成功获取到锁,锁定并立即解锁if(l != null) {l.lock();l.unlock();}// 3.4 如果 entry 的 Xmax 等于当前事务的 xid,说明该 entry 已经被当前事务删除,返回 falseif(entry.getXmax() == xid) {return false;}// 3.5 检查是否发生版本跳过,如果发生版本跳过,则抛出异常if(Visibility.isVersionSkip(tm, t, entry)) {t.err = Error.ConcurrentUpdateException;internAbort(xid, true);t.autoAborted = true;throw t.err;}// 3.6 设置 entry 的 Xmax 为当前事务的 xid,并返回 trueentry.setXmax(xid);return true;} finally {// 4. 释放锁entry.release();}}t.autoAborted = true;throw t.err;}// 3.6 设置 entry 的 Xmax 为当前事务的 xid,并返回 trueentry.setXmax(xid);return true;} finally {// 4. 释放锁entry.release();}}

相关文章:

【MyDB】4-VersionManager 之 4-VM的实现

【MyDB】4-VersionManager 之 4-VM的实现 VM 的实现VM(VersionManager)的基本定义与实现优化具体功能实现begin()开启事务commit()提交事务abort 中止事务read 读取uid对应的数据记录所在的entryinsert方法&#xff0c;插入数据delete方法 VM 的实现 本章代码位于&#xff1a;t…...

2024-2025自动驾驶技术演进与产业破局的深度实践——一名自动驾驶算法工程师的年度技术总结与行业洞察

一、引言&#xff1a;站在自动驾驶的"技术奇点" 2024年是自动驾驶行业从"技术验证"迈向"商业化落地"的关键转折点。从特斯拉FSD V12的端到端技术突破&#xff0c;到中国L3法规的破冰&#xff0c;从大模型重构感知架构&#xff0c;到城市NOA的&qu…...

计算机网络 笔记 传输层

概述&#xff1a; 主要功能&#xff1a; TCP&#xff1a; 特点***&#xff1a; 数据格式&#xff1a; 连接管理***&#xff1a; 建立连接&#xff08;三次握手&#xff09; 释放连接&#xff08;四次挥手&#xff09; 应用场景 UDP&#xff1a; 特点&#xff1a; 数…...

(leetcode 213 打家劫舍ii)

代码随想录&#xff1a; 将一个线性数组换成两个线性数组&#xff08;去掉头&#xff0c;去掉尾&#xff09; 分别求两个线性数组的最大值 最后求这两个数组的最大值 代码随想录视频 #include<iostream> #include<vector> #include<algorithm> //nums:2,…...

《TCP 网络编程实战:开发流程、缓冲区原理、三次握手与四次挥手》

一、 TCP 网络应用程序开发流程 学习目标 能够知道TCP客户端程序的开发流程1. TCP 网络应用程序开发流程的介绍 TCP 网络应用程序开发分为: TCP 客户端程序开发TCP 服务端程序开发说明: 客户端程序是指运行在用户设备上的程序 服务端程序是指运行在服务器设备上的程序,专门…...

62.异步编程+Prism

为什么不需要在构造函数中初始化了&#xff1f; private ICommand _fetchUserInfoCommand; public ICommand FetchUserInfoCommand > _fetchUserInfoCommand ?? new DelegateCommand(ExecuteFetchUserInfoAsync); public MainWindowViewModel() {// 无需…...

基于亿坊PHP框架构建物联网解决方案的优势分析!

在物联网 (IoT) 领域&#xff0c;选到合适的框架对于整个项目的开展也尤为重要。通常情况下&#xff0c;基于PHP的一些主流框架被用户常选择&#xff0c;今天就带大家了解下基于亿坊PHP框架构建物联网解决方案的优势有哪些&#xff1f; 1、开发效率高 在物联网项目中&#xf…...

把本地搭建的hexo博客部署到自己的服务器上

配置远程服务器的git 安装git 安装依赖工具包 yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel安装编译工具 yum install -y gcc perl-ExtUtils-MakeMaker package下载git&#xff0c;也可以去官网下载了传到服务器上 wget https://www.ke…...

《DeepSeek 实用集成:大模型能力接入各类软件》

DeepSeek 实用集成 awesome-deepseek-integration/README_cn.md at main deepseek-ai/awesome-deepseek-integration 将 DeepSeek 大模型能力轻松接入各类软件。访问 DeepSeek 开放平台来获取您的 API key。 English/简体中文 应用程序 Chatbox一个支持多种流行LLM模型的桌…...

接口使用实例(1)

大家好&#xff0c;今天我们来看看接口的一些实例&#xff0c;关于如何定义和实现接口&#xff0c;相信通过这些例子&#xff0c;我们能有一些清晰的认知。 先定义一个学生类&#xff1a; 再给定一个学生数组&#xff0c;对这个对象数组中的元素进行排序&#xff08;按分数排&…...

Git 版本控制:基础介绍与常用操作

目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中&#xff0c;开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…...

leetcode——合并K个有序链表(java)

给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&#…...

跨境数据传输问题常见解决方式

在全球化经济的浪潮下&#xff0c;跨境数据传输已然成为企业日常运营的关键环节。随着数字贸易的蓬勃发展和跨国业务的持续扩张&#xff0c;企业在跨境数据处理方面遭遇了诸多棘手难题。那么&#xff0c;面对这些常见问题&#xff0c;企业该如何应对&#xff1f;镭速跨境数据传…...

python-leetcode-删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def removeNthFromEnd(self…...

EasyExcel写入和读取多个sheet

最近在工作中&#xff0c;作者频频接触到Excel处理&#xff0c;因此也对EasyExcel进行了一定的研究和学习&#xff0c;也曾困扰过如何处理多个sheet&#xff0c;因此此处分享给大家&#xff0c;希望能有所帮助 目录 1.依赖 2. Excel类 3.处理Excel读取和写入多个sheet 4. 执…...

lanqiaoOJ 2097:青蛙过河 ← 二分+前缀和+贪心

【题目来源】 https://www.lanqiao.cn/problems/2097/learning/ https://www.luogu.com.cn/problem/P8775 【题目描述】 小青蛙住在一条河边&#xff0c;它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。 备注&#xff1a;此图由百度 AI 创作生成 河里的石头排…...

woocommerce独立站与wordpress独立站的最大区别是什么

WooCommerce独立站与WordPress独立站的最大区别在于它们的功能定位和使用场景。 WordPress是一个开源的内容管理系统(CMS)&#xff0c;最初是作为博客平台发展起来的&#xff0c;但现在已经演变为一个功能丰富的网站构建工具。它主要用于创建动态网站&#xff0c;提供广泛的定…...

MybatisX插件快速创建项目

一、安装插件 二、创建一个数据表测试 三、IDEA连接Mysql数据库 四、选择MybatiX构造器 五、配置参数 六、项目结构...

【Leetcode 每日一题 - 补卡】219. 存在重复元素 II

问题背景 给你一个整数数组 n u m s nums nums 和一个整数 k k k&#xff0c;判断数组中是否存在两个 不同的索引 i i i 和 j j j&#xff0c;满足 n u m s [ i ] n u m s [ j ] nums[i] nums[j] nums[i]nums[j] 且 ∣ i − j ∣ < k |i - j| < k ∣i−j∣<…...

llama3学习

首先是预训练部分&#xff0c;数据注意版权和风险问题。数据去重和数据清理&#xff0c;PII人的身份信息&#xff08;人名、地址等&#xff09;。如果数据有大量PII数据则这个数据丢掉。 网页的数据&#xff0c;提取&#xff0c;代码和数学的提取的特别的方法&#xff0c;OCR…...

H3CNE-31-BFD

Bidirectional Forwarding Dection&#xff0c;双向转发检查 作用&#xff1a;毫秒级故障检查&#xff0c;通常结合三层协议&#xff08;静态路由、vrrp、ospf、BGP等&#xff09;&#xff0c;实现链路故障快速检查。 BFD配置示例 没有中间的SW&#xff0c;接口down&#xff…...

VMware安装win10记录

(1)下载vmware&#xff0c;这个pro现在也免费的&#xff0c;下载地址&#xff1a;https://support.broadcom.com/group/ecx/productfiles?subFamilyVMware%20Workstation%20Pro&displayGroupVMware%20Workstation%20Pro%2017.0%20for%20Windows&release17.6.2&os&…...

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位取反运算&#xff1a;一个二进制数&#xff0c;0变1,1变0。 【1】…...

Ability Kit(程序框架服务)

Ability Kit&#xff08;程序框架服务&#xff09;提供了应用程序开发和运行的应用模型&#xff0c;是系统为开发者提供的应用程序所需能力的抽象提炼&#xff0c;它提供了应用程序必备的组件和运行机制。有了应用模型&#xff0c;开发者可以基于一套统一的模型进行应用开发&am…...

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器&#xff1f; 是一种动态拦截方法调用的机制&#xff0c;类似于过滤器。 拦截器是Spring框架中提供的&#xff0c;用来动态拦截控制器方法的执行。 拦截器的作用&#xff1a;拦截请求&#xff0c;在指定方法调用前后&#xff0c;根…...

IT服务管理平台(ITSM):构建高效运维体系的基石

IT服务管理平台(ITSM):构建高效运维体系的基石 在数字化转型浪潮的推动下,企业对IT服务的依赖日益加深,如何高效管理和优化IT服务成为企业面临的重要课题。IT服务管理平台(ITSM)应运而生,以其系统化的管理方法和工具,助力企业实现IT服务的规范化、高效化和智能化。本…...

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序

目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子&#xff1a; POST请求的例子&#xff1a; 3. 案例&#xff1a;…...

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下&#xff0c;智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术&#xff0c;旨在通过智能整合各类资源与信息&#xff0c;帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…...

尚硅谷spring框架视频教程——学习笔记一(IOC、AOP)

文章目录 前言一、控制反转&#xff08;IOC&#xff09;1. 底层原理2. 两种实现方式&#xff08;接口&#xff09;3. bean管理&#xff08;基于xml方式&#xff09;4. bean管理&#xff08;基于注解方式&#xff09; 二、面向切面编程&#xff08;AOP&#xff09;1. 底层逻辑2.…...

傅里叶分析之掐死教程

https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具&#xff0c;更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是&#xff0c;傅里叶分析的公式看起来太复杂了&#xff0c;所以很多…...