2023-05-12 数据库-关于事务及数据安全-思考

文章探讨了事务中确保数据安全的两种主要策略:undo日志用于记录元素修改前的状态,便于回滚未提交的更改;redo日志(如InnoDB的WAL)记录元素修改后的新值,允许快速恢复已提交的事务。这两种日志机制在磁盘I/O和事务持久化方面各有优劣。DuckDB、InnoDB和PerconaMySQL的RocksDB引擎是实现这些策略的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:

记录关于事务及数据安全的思考, 虽说持久性和一致性是事务的特征, 不过将数据安全再摘出来还是有好处。

事务中对于数据安全的实现的策略:

一. undo日志

  1. 记录元素修改前的数据
  2. 由于记录旧的数据, 所以可以用其数据完成多版本控制
  3. 必须要在元素修改前,将旧元素写到磁盘的undo日志
  4. 当事务commit到磁盘时后, 则将undo日志中的记录做标记
  5. 利用undo日志恢复数据
    1. 当遇到没有commit标记的记录时,则作旧元素恢复
    2. 当存在commit标记时, 则跳过
  6. 可以看下利用undo日志的磁盘io
    1. 事务开始时做记录
    2. 元素修改前做undo元素记录
    3. 事务提交后做undo事务标记
  7. undo日志涉及大量的磁盘io

二. redo日志

  1. innodb中使用redo日志这个名字, 一些数据更直接的就称呼为WAL, write append log, 例如rocksdb, influxdb, duckdb
  2. redo日志中记录事务中元素要修改后的新值
  3. 由于只需要记录元素的修改, 磁盘IO相比undo日志要少
    1. 事务开始时记录事务信息
    2. 元素在内存缓冲区中修改后, 立即写入redo日志的元素变更
    3. 当事务commit时, 在redo日志中做commit标记
    4. 整个过程都不要求事务系统做磁盘IO持久化, 仅需要写redo日志
  4. 但是使用redo日志有限制条件,
    1. 当事务开始前, 元素的旧值必须已经通过事务系统持久化到磁盘
    2. 也就是说,每一个新的事务开始写redo日志的前提, 是该元素的旧值可以从磁盘中恢复
    3. 这也很好理解, 利用redo进行恢复, 是利用新值进行覆盖, 如果redo日志中没有, 那么就说明事务系统的持久化数据可信
    4. 对应的, 如果redo日志中存在commit, 那么必须进行新值覆盖

三. 可参考的数据安全的实现

  1. duckdb的WAL层
  2. innodb的undo log和redo log
  3. percona-mysql的rocksdb引擎的事务实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟世者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值