数据库事务(ACID)及其实现概述

您所在的位置:网站首页 事务的acid特性是什么 数据库事务(ACID)及其实现概述

数据库事务(ACID)及其实现概述

2024-07-01 15:41| 来源: 网络整理| 查看: 265

数据库事务 前言事务是什么事务的四大特性(ACID)各个特性的保证方法原子性一致性隔离性持久性 总结

前言 在面试(后端)中,经常会被问到数据库的相关题目,而数据库的事务及其四大特性和实现方法更是经常被考察的问题,所以在此对其进行简单记录。 事务是什么

数据库事务(transcation)是访问并可能操作数据的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。数据库事务是数据库最小逻辑单元。

通俗的话来讲,关系型数据库当中事务是一条或多条SQL语句。

其语法主要为:

begin transaction sql语句1 sql语句2 ... commit/rollback; 事务的四大特性(ACID)

原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功要么全部失败。

一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。【何谓不一致状态:数据库发生故障有些事务未完成就被迫中断,其中一部分已经写入数据库,即为不正常、不一致状态】

隔离性(Isolation):一个事务的执行不能被其他事务干扰。【意为同一个事务在前后无修改访问一个数据,其值也不应该不同】 若隔离性没有很好的保证,就会出现多事务并发而导致死锁的问题。

持久性(Durablity):一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。【意为,就算后一个事务出现异常,数据库出现问题,但前一个事务的相关结果依旧存在不会被改变】

各个特性的保证方法

原子性——undo log 一致性——undo log+redo log 隔离性——各类锁机制 持久性——redo log

此处也仅仅是大致方法,普通面试答到这种程度应该已经够了。 细纠的话有更多细节。

原子性

原子性要保证其整体性,所以事务若是在执行的过程当中,突然发生不可预知的错误,事务没能提交,那么此时我们就需要数据库在执行前的一个状态或版本,此时就是undo log发生作用的时候。

undo log保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制即乐观锁实现。且其日志内的内容是逻辑格式的,并不是保存数据库内的物理数据。

一致性

一致性其实是事务实现的最终目标,而原子性,隔离性和持久性都是为其服务的。所以其的实现可以视作其他三种机制实现给其带来的保证。

隔离性

隔离性主要是为了防止多事务并发产生问题,而其的实现主要依赖于锁。

依据隔离性,由引导出了事务的各类隔离级别,他们的出现主要是为了解决各类事务并发产生的问题,在实际的数据库设计中,隔离级别越高,导致数据库的并发效率会越低;而隔离级别太低,又会导致数据库在读写过程中会遇到各种乱七八糟的问题。

在此不再对其赘述,可以看下图文进行了解: 隔离级别 各类隔离级别的实现离不开锁的机制,在数据库当中依据不同的划分标准,锁可以被划分为如下几类:

按照粒度划分:行锁,表锁,页锁 按照使用方式划分:共享锁(读锁),排它锁(写锁) 按照思想划分:悲观锁,乐观锁(主要在解决死锁的时候可以提出乐观锁)

【关于这一部分,在面试当中主要会考察隔离级别,隔离问题和死锁】

持久性

持久性的出现主要是因为我们的sql语句执行以后不会立刻写入磁盘当中,而是写入数据库的buffer pool缓存当中【Innodb引擎当中】,而buffer pool只有累计到一定脏页才会进行刷盘即把数据库内的数据写入磁盘的操作,在这提交和刷盘的过程当中,一旦数据库因为错误宕机就会发生数据库提交事务重启未完成的情况,因此此时redo log就应运而生。

redo log是物理格式的日志,记录的是物理数据页面修改的信息。与undo log不同。并且其并不是在事务提交操作之后再将其写入redo log而是在事务执行过程当中便开始写入日志文件当中。而当buffer pool内的脏页数据被写入磁盘之后,其生命周期也已结束,其占用空间也会被覆盖。

总结

本篇文章主要对各个事务特性及其实现方法进行了一个概述。 因为各种数据库的实现方法,引擎的不同都会造成一些不同。但是后端面试问到相关问题,达到这种程度应该已经足够。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3