1. 前言

都知道数据库事务有ACID特性(原子性、一致性、隔离型、持久性),本文简单聊一下它们的实现原理。

2. 日志文件

2.1. redo log

redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。

当事务提交之后会把所有修改信息都会存到该日志中。假设有个表叫做tb1(id,username) 现在要插入数据(3,ceshi)

start transaction;

select balance from bank where name="zhangsan";

// 生成 重做日志 balance=600

update bank set balance = balance - 400;

// 生成 重做日志 amount=400

update finance set amount = amount + 400;

commit;

redo log 有什么作用?

mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。

那么问题来了,如果还没来的同步的时候宕机或断电了怎么办?还没来得及执行上面图中红色的操作。这样会导致丢部分已提交事务的修改信息!

所以引入了redo log来记录已成功提交事务的修改信息,并且会把redo log持久化到磁盘,系统重启之后在读取redo log恢复最新数据。

总结:redo log是用来恢复数据的 用于保障,已提交事务的持久化特性。

2.2. undo log

undo log 叫做回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

还用上面那两张表

每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log。undo log 有什么作用?

undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

总结:undo log是用来回滚数据的用于保障 未提交事务的原子性。

2.3. archive log(binlog)

archive log(归档日志)是Oracle数据库中的概念,它其实是redo log的衍生物。

在Mysql数据库中,归档日志有另外一个名字 binlog(二进制日志 binary log),在mysql主从模式中,从节点就是通过同步主节点的binlog实现主从同步的。

redo log file是LGWR进程从Oracle实例中的redo log buffer写入的,是循环利用的。就是说一个redo log file写满后,才写下一个。归档日志是当数据库运行在归档模式下时,一个redo log file写满后,由ARCn进程将重做日志的内容备份到归档日志文件下,然后这个redo log file才能被下一次使用。

不管数据库是否是归档模式,重做日志是肯定要写的。而只有数据库在归档模式下,重做日志才会备份,形成归档日志。

redo log是循环利用的,但是归档日志不是,它不断接收从redo log中写入的日志备份。因此到一定时间后,会导致数据库存储不够,影响数据库使用。我们一般都会执行一个定时脚本,在规定时间周期后,删掉保留周期前的归档日志文件。

3. 锁和MVCC基础

3.1. 锁

具体关于锁的知识,可以翻看前面的文章《数据库事务和锁》。简单来分,锁分为下面共享锁和排他锁:共享锁(shared lock),又叫做"读锁"

读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。排他锁(exclusive lock),又叫做"写锁"

写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。

因此通过读写锁,只有读读可以并行,但是写读,写写都不能做到并行

事务的隔离性就是根据读写锁来实现的,这个后面再说。

3.2. MVCC基础

MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制。InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的。这两个列,

一个保存了行的创建时间,一个保存了行的过期时间,

当然存储的并不是实际的时间值,而是系统版本号。

以上片段摘自《高性能Mysql》这本书对MVCC的定义。他的主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。

MVCC在mysql中的实现依赖的是undo log与read viewundo log :undo log 中记录某行数据的多个版本的数据。

read view :用来判断当前版本数据的可见性。

4. 事务的实现原理

前面讲的重做日志,回滚日志以及锁技术就是实现事务的基础。原子性:使用 undo log ,从而达到回滚。

持久性:使用 redo log,从而达到故障后恢复。

隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行。

一致性:一致性是通过原子性,持久性,隔离性来实现的。通过回滚,以及恢复,和在并发环境下的隔离做到一致性。

原子性,持久性,隔离性折腾半天的目的也是为了保障数据的一致性。总之,ACID只是个概念,事务最终目的是要保障数据的可靠性,一致性。

oracle 事务实现原理,数据库事务的实现原理相关推荐

  1. 使用事务注解导致数据库事务一直在运行

    使用事务注解导致数据库事务一直在运行 1.问题出现原因: 场景: @Override//bcId 要选择的品牌对应bcid 不是头部的@Transactional(rollbackFor = Exce ...

  2. Spring JDBC-Spring事务管理之数据库事务基础知识

    概述 数据库事务的概念 原子性 一致性 隔离性 持久性 数据并发的问题 脏读dirty read 不可重复读unrepeatable read 幻象读 phantom read 幻象读和不可重复度的区 ...

  3. Spring事务管理--(一)数据库事务隔离级别与mysql引擎基础讲解

    一.前言 本篇文章来自网络整理,很简单,但是很实用对于初级和中级工程师. 原创地址1:http://www.cnblogs.com/hollen/archive/2012/05/13/2498309. ...

  4. pgsql数据库默认配置事务类型_PostgreSQL数据库事务出现未知状态的处理方法

    背景 数据库的事务是原子操作,要么成功,要么失败.但是实际上在客户端的视角,可能有第三种状态:unknown状态. 当客户端提交事务结束(rollback , commit , prepare xac ...

  5. spring配置mysql事务管理_Spring 数据库事务管理机制

    要点1 Spring事务管理方法编程式事务(TransactionTemplate.PlatformTransactionManager) 声明式事务(配置式.注解式) 2 Spring 注解 @Tr ...

  6. Spring的事务管理和数据库事务相关知识

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱.         比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱. ...

  7. mysql 事务原子性_数据库事务原子性、一致性是怎样实现的?

    先借用前辈的一句话:数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别. 隔离性分为四个级别: 1读未提交:(Read Uncommitted) 2读已提 ...

  8. php事务基本要素,数据库事务正确执行的四个基本要素

    ACID是数据库事务正确执行的四个基本要素的缩写,即原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability).一个支持事务(Tran ...

  9. mysql事务并发控制_数据库 事务并发控制

    事务是一个逻辑工作单元, SQLServer 2005 提供了几种自动的可以通过编程来完成的机制,包括事务日志. SQL 事务控制语句,以及事务处理运行过程中通过锁定保证数据完整性的机制.当用户对数据 ...

最新文章

  1. 特斯拉炫技现场:电驴、行人、快递车,中国的小路难不倒Autopilot自动驾驶
  2. 软件测试相关好文收集
  3. alpha beta 滤波_不同Alpha-Beta滤波算法的精度分析及改进
  4. 了解javascript中函数执行顺序
  5. windowsphone7高级编程中提到的地址
  6. 【Javascript 拾遗之三】Closure 闭包
  7. pip安装软件 Command “python setup.py egg_info“ failed with error code 1 in
  8. 计算机关于word试题及答案,职称计算机考试Word操作试题及答案
  9. Hadoop3——集群搭建以及初体验
  10. 【TA-霜狼_may-《百人计划》】图形3.3 曲面细分与几何着色器 大规模草渲染
  11. 关于阿里云域名购买与DNS解析教程
  12. android 邮箱 推荐,Android邮箱谁最棒?最新热门邮箱App横向测试
  13. (ECCV 2022)E-NeRV: Expedite Neural Video Representation with Disentangled Spatial-Temporal Context
  14. 【转载】Python第三方库资源
  15. 计算机网络自顶向下方法 第三章 作业习题答案
  16. Visual Studio2015安装步骤详解
  17. ubuntu安装迅雷
  18. 第六章 Caché 设计模式 原型模式
  19. matlab中方差直方图,如何在MATLAB中标准化直方图?
  20. bpsk的matlab仿真,用MATLAB仿真BPSK调制

热门文章

  1. Facebook 公司:如何清除 960 万句“脏话”?
  2. 面对 MySQL 查询索引失效,程序员的六大优化技巧!
  3. 腾讯 QQ 产品已经实现全量上云;中科院计算所发明新编程语言“木兰”;Electron 7.1.9 发布 | 极客头条...
  4. Android 10 重磅来袭:支持 5G 与折叠屏、隐私安全全面升级!
  5. Rust 编程有什么好?
  6. 5G 爆发前夕,将渗透哪些领域?
  7. 编程猫获新一轮 3 亿融资:做好少儿编程教育基础设施!
  8. 引入神经网络 API 1.1、支持全面屏,Android 9.0 来了!
  9. 8个深度学习方面的最佳实践
  10. Java面试官最爱问的垃圾回收机制,Java编程配置思路详解