当前课程知识点:数据库概论 > 第八章 事务处理 > 8.1 事务的ACID性质介绍 > ACID介绍
同学们好
我是来自云南大学软件学院的包崇明
下面我为大家介绍更新事务
首先
我们来看一下
大型应用程序执行过程中
可能出现的问题
以及事务提供的ACID性质
如何解决这些问题
20世纪50年代开始
人们在开发大型应用程序的时候
遇到了一系列问题
以银行的日常业务处理程序为例
程序必须允许多个出纳员
同时处理多个顾客账户的读取和更新操作
这类系统可能会出现以下三种问题
第一类问题是
程序执行产生不一致的结果
考虑这样一种情形
当一个顾客提出转账需求
程序需要执行两个操作
首先从转出账户扣除转账金额
然后将这笔金额
加到顾客的另外一个账户上
假设顾客的每一条账户信息
都是存储在磁盘文件中的一条记录
程序首先从文件中读出转出账户记录
扣除转账金额
然后将这条记录写回磁盘文件
接着读出转入账户记录
在准备写入转账金额的时候
出现了电源故障
程序崩溃
转账金额没有写入转入账户
顾客账户信息出现不一致的结果
转出账户被扣款
而转入账户却没有入账
问题是2
并发执行可能会出现错误
假设出纳员1正在为一个顾客转账
从顾客账户A转一笔钱到顾客账户B
出纳员2正在为这个顾客做信用评估
需要将他两个账户的余额进行累加
以判断他是否能够通过信用评估
如果出纳员1
操作的程序刚将转账金额从账户A扣除
还没有在账户B加上这笔钱的时候
出纳员2操作的程序
就读出顾客的
两个账户的余额进行了累加操作
那么出纳员2看到的
将是比顾客实际存款要少的金额
由此可能导致这位顾客不能通过信用评估
这意味着并发执行的业务
可能读到业务处理的中间结果而相互干扰
问题3是
不确定更新过的数据
是否已经存储到磁盘文件中
为了减少磁盘的访问次数
我们通常采用缓存技术
就是将常用的磁盘页面读入内存
先在内存中对数据更新然后再写回磁盘
这需要一种策略来解决
何时将缓存写入磁盘
频繁写回磁盘意味着不能减少磁盘IO
缓存时间过长
又担心发生系统崩溃丢失信息
这导致了不能确定更新后的数据
是否已经写回磁盘文件
在文件系统时代
人们需要通过编程来解决上述问题
在数据库系统中
我们可通过事务来解决上述问题
我们先来看一下事务的定义
事务定义为对数据库的一组读写操作
这些操作要么全部执行
要么全部不执行
是一个逻辑上不可分割的单元
比如转账业务可定义为一个事务
这个事务包括读出转出账户余额
转出账户扣除转账金额
读出转入账户余额
转入账户加上转账金额四个操作
信用评估业务也可定义为一个事务
包括从两个账户读出余额的读操作
对于哪些操作可定义为一个事务
是由程序员根据业务逻辑规则来决定的
比如将转账业务定义为一个事务
是依据顾客在银行的存款金额
不能凭空增加也不能凭空减少这样的规则
要求转账过程中
从转出账户转出多少钱
转入账户就一定要转入多少钱
程序员将一组操作定义为事务后
数据库系统通过对事务
提供以下四个保证来解决
上述银行业务系统可能遇到的问题
这四个保证我们称之为
ACID保证或事务的ACID性质
ACID中A代表Atomicity
称为原子性
C代表Consistency
称为一致性
I 代表Isolation
称为隔离性
D 代表Durability
称为持久性
下面我们对这四个事务性质的含义
做详细的解释
原子性是指
事务包含的操作集合
是不可分割的逻辑单元
也就是说
这些操作对于数据库而言
要么全做要么全不做
不能部分地完成
即便发生系统崩溃也仍能得到保证
原子性解决了转账业务
可能产生不一致结果的问题
一致性是指
多个事务并发执行不会破坏
每一个事务需要遵循的逻辑规则
一致性保证在逻辑上不是独立的
它蕴含于事务的隔离性保证
也就是说
当隔离性得到保证
一致性也能得到保证
所以我们重点介绍事务的隔离性
我们将不同事务操作交错执行
定义为事务的并发执行
当两个事务并发执行时
一个事务可能读写
另外一个事务正在处理的中间数据
这两个事务执行结果就会相互影响
出现上提到的第二类问题
比如我们前面提到的转账事务
和信用评估事务并发执行的时候
信用评估事务执行时
读到了转账事务正在读写的数据的中间结果
导致顾客不能通过信用评估
但如果我们让事务串行执行
即一个事务的全部操作执行完后
再开始执行另外一个事务
就不会出现这类问题
隔离性保证事务并发执行的结果
等同于某个串行执行结果
解决了由于并发执行可能出现的第二类问题
持久性是指
当事务提交后
系统保证事务的更新数据一定写入磁盘
对数据的持久性提供了保证
即使出现系统崩溃
也能够保证该事务是可恢复的
这样更新后数据的持久性得到了保证
解决了前面提到的第三个问题
下面我们对SQL语言中
事务的语法做简单介绍
我们用
BEGIN TRANSACTION语句
来启动一个事务
其后是组成事务的一条
或者多条sql语句
最后通过提交或者回滚来结束这个事务
如果事务成功结束
我们用
Commit TRANSACTION语句
来提交事务
更新的数据将写入磁盘文件
其他并发事务能够访问事务更新后的数据
如果事务执行过程中出现错误
我们用
ROLLBACK TRANSACTION语句
来回滚事务
通知数据库系统事务没有成功结束
需要恢复事务更新了的数据
其他并发事务可访问恢复后的数据
对事物的ACID属性介绍完毕
谢谢大家
-数据库概述
--Video
-导论--数据库概述
-1.1 数据库基础
--Video
-第一章 数据库基础--1.1 数据库基础
-2.1 CAP数据库
--CAP数据库
-第二章 关系运算--2.1 CAP数据库
-2.2 自然关系运算1
-- 自然关系运算1
-第二章 关系运算--2.2 自然关系运算1
-2.3 自然关系运算2
--自然关系运算2
-第二章 关系运算--2.3 自然关系运算2
-3.1 SQL概述
-- SQL概述
-3.1 SQL概述--作业
-3.2 数据定义DDL
--数据定义DDL
-3.2 数据定义DDL--作业
-3.3 SQL数据更新DML
-3.3 SQL数据更新DML--作业
-3.4 复杂SQL查询操作1
-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1
-3.5 复杂SQL查询操作2
-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2
-4.1 数据完整性
-4.1 数据完整性--作业
-4.2 完整性约束
--完整性约束
-4.2 完整性约束--作业
-4.3 外键约束
--外键约束
-4.3 外键约束--作业
-4.4 触发器
--触发器
-4.4 触发器--作业
-4.5 视图
--视图
-4.5 视图--作业
-4.6 安全性
--安全性
-4.6 安全性--作业
-5.1 索引
--Video
-5.2 B+树索引
--Video
-6.1 函数依赖
--Video
-6.2 Armstrong公理
--Video
-6.3 无损分解
--Video
-6.4 范式举例
--Video
-6.5 三种范式
--Video
-6.5 三种范式--作业
-7.1-E-R模型概述
--E-R模型概述
-7.2 E-R模型详解
--Video
-7.3 E-R模型的拓展
--Video
-7.4 E-R模型实例分析
--Video
-8.1 事务的ACID性质介绍
--ACID介绍
-8.1 事务的ACID性质介绍--作业
-8.2 事务经历
--事务经历
-8.2 事务经历--作业
-8.3 可串行化调度和前趋图
-8.3 可串行化调度和前趋图--作业
-8.4 两阶段封锁
--两段锁协议
-8.4 两阶段封锁--作业
-8.5 隔离级别
--隔离级别
-8.5 隔离级别--作业
-8.6 事务恢复
--事务恢复
-8.6 事务恢复--作业
-9.1 数据库使用介绍
--数据库使用介绍
-9.2 Java访问数据库
-9.2 Java访问数据库--作业
-10.1 数据库新技术概述
--Video
