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

找人做网站被骗 公安不管/学生制作个人网站

找人做网站被骗 公安不管,学生制作个人网站,桂林昨晚发生的新闻,常熟企业网站建设原子事务 11.1 全有或全无效应 二级索引需要原子性的多键更新,这不仅对数据库内部一致性至关重要,也对应用数据的一致性非常有用(例如考虑账户余额和账户交易)。 我们将放弃get-set-del接口,并添加一个新的接口来允…

在这里插入图片描述

原子事务

11.1 全有或全无效应

二级索引需要原子性的多键更新,这不仅对数据库内部一致性至关重要,也对应用数据的一致性非常有用(例如考虑账户余额和账户交易)。

我们将放弃get-set-del接口,并添加一个新的接口来允许一组操作的原子执行。并发控制将在下一章讨论。

提交与回滚

我们将添加接口以标记事务的开始和结束。在结束时,更新要么生效(提交),要么由于错误或用户请求(中止)被丢弃(回滚)。

// 开始一个事务
func (kv *KV) Begin(tx *KVTX)// 结束一个事务:提交更新;发生错误则回滚
func (kv *KV) Commit(tx *KVTX) error// 结束一个事务:回滚
func (kv *KV) Abort(tx *KVTX)
写时复制实现原子性

通过写时复制(copy-on-write),无论是提交还是回滚都只是更新根指针。这已经在第6章作为错误处理实现了。

type KVTX struct {db   *KVmeta []byte // 用于回滚
}func (kv *KV) Begin(tx *KVTX) {tx.db = kvtx.meta = saveMeta(tx.db)
}func (kv *KV) Commit(tx *KVTX) error {return updateOrRevert(tx.db, tx.meta)
}func (kv *KV) Abort(tx *KVTX) {loadMeta(tx.db, tx.meta)tx.db.page.nappend = 0tx.db.page.updates = map[uint64][]byte{}
}

以前updateOrRevert()是在单个键更新后调用的。现在它被移动到了KVTX.Commit()。B+树可以根据需要多次更新,重要的是根指针。

另一种方法是通过日志实现原子性,在写时复制树中,更新由根指针捕获,而在原地更新中,则需要日志来捕获更新。

11.2 事务性接口

将树操作移到事务中

树操作现在与事务关联,因此它们被移到了KVTX中。

func (tx *KVTX) Seek(key []byte, cmp int) *BIter {return tx.db.tree.Seek(key, cmp)
}func (tx *KVTX) Update(req *UpdateReq) bool {return tx.db.tree.Update(req)
}func (tx *KVTX) Del(req *DeleteReq) bool {return tx.db.tree.Delete(req)
}

注意,这些函数不再返回错误,因为实际的磁盘更新被移到了KVTX.Commit()中。

事务表操作

对于基于表的接口,只需为KVTX添加一个包装类型。

type DBTX struct {kv KVTXdb *DB
}func (db *DB) Begin(tx *DBTX)
func (db *DB) Commit(tx *DBTX) error
func (db *DB) Abort(tx *DBTX)func (tx *DBTX) Scan(table string, req *Scanner) error
func (tx *DBTX) Set(table string, rec Record, mode int) (bool, error)
func (tx *DBTX) Delete(table string, rec Record) (bool, error)

这些操作不再处理IO错误,因此没有更新二级索引的错误处理。

11.3 可选优化

尽管我们已经建立了一个支持顺序操作的关系型数据库系统,但为了进一步挑战,还有一些优化可以考虑:

  • 减少多键更新时的复制:写时复制在一次更新中从叶节点到根节点复制节点,这对于多键更新来说不是最优的,因为中间树的节点在一个事务内分配、更新一次然后被删除。优化方法是在一个事务内只复制一次节点,并在复制的节点上使用原地更新。

  • 范围删除:虽然我们现在可以进行多键更新,但删除大量键(如删除表)仍然存在资源使用的难题。简单的做法是一次迭代并逐个删除键,但这会将整个表读入内存并在删除前反复更新节点,做了一些无用的工作。一些数据库对每个表使用单独的文件,所以这不是问题。在我们的案例中,所有内容使用单一的B+树,我们可以实现一个范围删除操作,无需查看即可释放具有特定范围的所有叶节点。

  • 压缩公共前缀:在任何排序的数据中,邻近的键可能共享一个公共前缀。在典型的关系数据库使用场景中,多列键也会导致共享前缀。因此有机会压缩节点内的键。前缀压缩使实现更加复杂(有趣),尤其是在合并和分裂时节点大小不容易预测的情况下。

代码仓库地址:database-go

http://www.lryc.cn/news/577329.html

相关文章:

  • 深圳网站建设在哪里可以/今日国内新闻摘抄十条
  • wordpress与drupal对比/优化建站seo门户
  • 个人做网站猛赚钱/seo的工作流程
  • 沈阳设计培训网站建设/店铺推广方案怎么写
  • 企业官网网页设计/徐州网站优化
  • wordpress表单美化/小时seo百度关键词点击器
  • 镇江网站建设联系思创/网络营销的主要推广方式
  • 手机网站模版更换技巧/专业做网站
  • 网站设计套餐/seo优化工作内容
  • 传奇页游/外汇seo公司
  • 网站建设的标准化建设是什么/青岛做网站推广公司
  • 网站建站如何入手/百度词条优化工作
  • 开福区互动网站建设/搜索引擎优化自然排名
  • 商城网站验收/深圳在线制作网站
  • 橙子建站链接/seo社区
  • 网站建设体会/百度教育官网
  • Deep Mean-Shift Priors for Image Restoration论文阅读
  • 一些LINQ的普遍写法
  • 文心4.5开源大模型的使用和部署
  • K8S初始化master节点不成功kubelet.service failed(cgroup driver配置问题)
  • Python 数据分析与机器学习入门 (六):Seaborn 可视化技巧,图表更美观
  • Python 库 包 accelerate
  • 插入排序的简单介绍
  • 百度文心大模型4.5系列正式开源,同步开放API服务
  • 百度文心大模型4.5系列正式开源,开源会给百度带来什么?
  • MongoDB 安装使用教程
  • 御控助力打造物联网实训室,赋能职业教育高质量发展
  • I/O I/O基本概念与基本I/O函数 6.30
  • YOLOv12_ultralytics-8.3.145_2025_5_27部分代码阅读笔记-autobackend.py
  • LeetCode Hot100(图论)