MySQL如何实现事务特性

目录

事务有那些特性

原子性如何实现 

持久性如何实现

隔离性与一致性如何实现


事务有那些特性

事务是由MySQL的引擎 InnoDB 来实现的

事务的特性 : 

原子性 不存在中间状态,要么完成,要么不完成

一致性 事务操作前和操作后,数据满足完整性的约束,数据库保持一致的状态

隔离性  事务与事务之间互不干扰,允许多个并发事务同时对其数据进行读写修改

持久性  事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

原子性如何实现 

原子性是通过 undo log(回滚日志) 来保证的,那么什么是回滚日志

CREATE TABLE my_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

如上,我创建一张表,表中含有 id 和 name 字段 在 数据存储中如下

每条记录都拥有着隐藏字段,包含事务id 和 undo 指针 (相当于版本链表) 如下

所以 当我们对数据操作成功时,保持在当前的undo指针 ,失败时,回到上一个 undo指针 

持久性如何实现

如图

Buffer bool 如何管理缓存 请看MySQL如何改进LRU算法_mysql 改进 lru-CSDN博客

也就是说 redo log 文件是专门记录某个数据页更改了什么,这样即使是系统故障,也能保证数据完整

 为什么已经有数据写入磁盘,还要redo log(重做日志)写入磁盘 这样多此一举呢?

写入 redo log(重做日志) 的方式使用了追加操作, 所以磁盘操作是顺序写

写入数据需要先找到写入位置,然后才写到磁盘,所以磁盘操作是随机写

磁盘的「顺序写 」比「随机写」 高效的多,因此 redo log 写入磁盘的开销更小。

 为什么是追加操作? 因为磁盘中有专属的Redo log 文件

隔离性与一致性如何实现

隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
一致性则是通过持久性+原子性+隔离性来保证;

MVCC 主要依赖 Read View(快照) 与 undo log(回滚日志实现)

undo log 示意如下:

 

 Read View 示意如下

 事务id划分

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值