数据库原理之事务(二)

  本文主要分析数据库并发控制的一系列问题。事务是并发控制的基本单位,保证事务ACID的特性是事务处理的重要任务,而并发操作有可能会破坏其ACID特性。

  一个数据库可能拥有多个访问客户端,这些客户端都可以并发方式访问数据库。数据库中的相同数据可能同时被多个事务访问,如果没有采取必要的隔离措施,就会导致各种并发问题,破坏数据的完整性。这些问题可以归结为5类,包括三类数据读问题(脏读、幻象读和不可重复读)以及两类数据更新问题(第一类丢失更新和第二类丢失更新)。下面,我们分别通过实例讲解引发问题的场景。

一、数据读取问题

1、脏读(Dirty Read)

  首先用一个例子来说,有这样一个笑话:一个结巴在饮料店柜台前转悠,老板很热情地迎上来:“喝一瓶?”,结巴连忙说:“我…喝…喝…”,老板麻利地打开易拉罐递给结巴,结巴终于憋出了他的那句话:“我…喝…喝…喝不起啊!”。在这个笑话中,饮料店老板就对结巴进行了脏读

  读“脏”数据是指事务A修改某一数据,并将其写回磁盘,事务B读取同一数据后,A由于某种原因被除撤消,而此时A把已修改过的数据又恢复原值,B读到的数据与数据库的数据不一致,则B读到的数据就为“脏”数据,即无效的数据。

  以存取款为例,来看看脏读的过程:


时间

转账事务A

取款事务B

T1

 

开始事务

T2

开始事务

 

T3

     

查询账户余额为1000元    

T4

        

取出500元把余额改为500元

T5

查询账户余额为500元(脏读)

 

T6

 

撤销事务余额恢复为1000元

T7

汇入100元把余额改为600元

 

T8

提交事务

 

  在这个场景中,B希望取款500元而后又撤销了动作,而A往相同的账户中转账100元,就因为A事务读取了B事务尚未提交的数据,因而造成账户白白丢失了500元。

2、不可重复读(Unrepeatable Read)

  不可重复读是指A事务读取了B事务已经提交的更改数据。假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致:


时间

取款事务A

转账事务B

T1

 

开始事务

T2

开始事务

                          

T3

                              

查询账户余额为1000元     

T4

查询账户余额为1000元

                          

T5

                  

取出100元把余额改为900元

T6

 

提交事务                  

T7

查询账户余额为900元(和T4读取的不一致)

 

  在这个场景中,同一事务的T4时间点和T7时间点读取账户存款余额不一样。

3、幻象读(Phantom Read)

  A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致:


时间

统计金额事务A

转账事务B

T1

 

开始事务

T2

开始事务

             

T3

统计总存款数为10000元

             

T4

 

新增一个存款账户,存款为100元

T5

 

提交事务     

T6

再次统计总存款数为10100元(幻象读)

 

  如果新增数据刚好满足事务的查询条件,这个新数据就进入了事务的视野,因而产生了两个统计不一致的情况。 
  幻象读和不可重复读是两个容易混淆的概念,前者是指读到了其它已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除),为了避免这两种情况,采取的对策是不同的,防止读取到更改数据,只需要对操作的数据添加行级锁,阻止操作中的数据发生变化,而防止读取到新增数据,则往往需要添加表级锁——将整个表锁定,防止新增数据。

二、数据写入问题

1、第一类丢失更新

  A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来:


时间

取款事务A

转账事务B

T1

开始事务

 

T2

 

开始事务

T3

查询账户余额为1000元    

 

T4

 

查询账户余额为1000元

T5

 

汇入100元把余额改为1100元

T6

 

提交事务

T7

取出100元把余额改为900元

 

T8

撤销事务

 

T9

余额恢复为1000元(丢失更新)

 

  在这个场景中,A事务在撤销时,“不小心”将B事务已经转入账户的金额给抹去了。

2、第二类丢失更新 
  A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失:


时间

转账事务A

取款事务B

T1

 

开始事务

T2

开始事务

                         

T3

               

查询账户余额为1000元    

T4

查询账户余额为1000元

                         

T5

 

取出100元把余额改为900元

T6

 

提交事务           

T7

汇入100元

 

T8

提交事务

 

T9

把余额改为1100元(丢失更新)

 

  在这个例子里,由于支票转账事务覆盖了取款事务对存款余额所做的更新,导致银行最后损失了100元,相反如果转账事务先提交,那么用户账户将损失100元。

时间: 2024-10-22 10:32:03

数据库原理之事务(二)的相关文章

数据库原理之事务(一)

数据库事务(Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么完整地执行,要么完全地不执行.事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠. 一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性.一致性.隔离性和持久性)属性.这四种属性的含义分别是: Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻

免费开放阅读 | 数据库管理系统的事务原理(上)

作者介绍: 那海蓝蓝,腾讯技术工程事业群计费平台部金融云TDSQL数据库T4级专家,熟悉PostgreSQL.MySQL.Informix等数据库内核技术,著有<数据库查询优化器的艺术>一书.<数据库事务处理的艺术>为最新出版力作,经机械工业出版社授权,"腾讯技术工程官方号"将独家免费开放阅读,我们将分期为读者奉上那海蓝蓝的技术盛宴. 本篇介绍数据库管理系统的事务处理技术,从数据库的事务理论出发界定事务处理技术的范围,讨论了事务机制应对的问题.事务处理的理论基础

数据库原理-事务基本概念

2018-1-9 by Atlas 数据库访问 read(X):把数据X,从磁盘的数据库中读到内存的缓冲区中.write(X):把数据X,从内存的缓存区写回磁盘的数据库. ACID性质 1.原子性(Atomicity)一个事务对数据的所有操作,是一个不可分割的工作单元.这些操作要么全部执行,要么什么也不做(就对DB的效果而言).保证原子性是数据库系统本身的职责,由DBMS的事务管理子系统实现.2.一致性(Consistency)一个事务独立执行的结果,应保持数据库的一致性,即数据不会因事务的执行

数据库原理 - 序列3 - 事务是如何实现的? - Redo Log解析

6.5 事务实现原理之1:Redo Log 介绍事务怎么用后,下面探讨事务的实现原理.事务有ACID四个核心属性:A:原子性.事务要么不执行,要么完全执行.如果执行到一半,宕机重启,已执行的一半要回滚回去.C:一致性.各种约束条件,比如主键不能为空.参照完整性等.I:隔离性.隔离性和并发性密切相关,因为如果事务全是串行的(第四个隔离级别),也不需要隔离.D:持久性.这个很容易理解,一旦事务提交了,数据就不能丢.在这四个属性中,D比较容易,C主要是由上层的各种规则来约束,也相对简单.而A和I牵涉并

笔面考点总结(二)数据库原理篇

前言 本篇是笔面考点总结系列的第二篇,主要总结数据库原理的考点. 数据库篇 数据库范式 第一范式确保属性的原子性约束,即要求数据库表中的字段具有原子性,不可再分解. 第二范式确保表中的每列都和主键相关,而不能只与主键的某一部分相关(针对联合主键而言). 第三方式确保每列都和主键列直接相关,而不是间接相关. 总体上来说就是,第一范式不可拆分,第二范式完全依赖,第三范式消除传递依赖. 表联结查询(以 MySQL 标准为例子) 自联结查询 自联结查询是表与自身进行联结的查询,例如从课程表中找出课程号及

《数据库原理》复习总结

<数据库原理>复习总结 数据库技术就是主要研究如何科学的组织和存储数据,高效的获取和处理数据,并可以满足用户各种不同的信息需求的技术,因为对数据库技术的需求非常大,所以学习这门课的知识和技术是非常必要的,应熟练弄清,掌握数据,数据管理,数据库,数据模型和概念模型的等专业术语的内涵. 第1章 绪论 1.掌握数据库.数据库管理系统.数据库系统(组成)的概念 2.了解数据库技术发展的三个阶段 3.掌握三级模式及二级映像的概念 4.理解数据库管理系统的主要功能 知识点: 数据:数据库系统研究和处理的对

《数据库原理与应用》复习试题归纳

  <数据库原理与应用>复习试题归纳 一.单项选择题(每小题1分,共20分) 1.数据库的三个模式中,真正存储数据的是( )A.内模式  B.模式  C.外模式  D.三者皆存储数据 2.在数据库的三个模式中(  ) A.内模式只有一个,而模式和外模式可以有多个 B.模式只有一个,而内模式和外模式可以有多个 C.模式和内模式只有一个,而外模式可以有多个 D.均只有一个 3.关于模式,下列说法中错误的是(   ) A.数据库的全局逻辑结构描述   B.数据库的框架 C.一组模式的集合      

数据库原理常见问答

常见问答 1.    试述数据库系统有哪些特点(特别是相对于文件系统)? ①数据共享,特别是实现数据字段的共享.②较高的数据独立性.③面向整体的数据结构话模型.④可控冗余度.⑤数据的统一管理和控制. 2.    简述关系的性质? ①任意两个元组不能全同.②元组是非排序的.③属性是非排序的.④属性必须有不同的名称,而不同属性可以来自一个域.⑤同一属性名处的诸属性值(同列)是同类型数据,且必须来自同一个域. 3.数据库设计过程包括哪几个主要阶段?哪些阶段独立于数据库管理系统? 哪些阶段依赖于数据库管

深入理解数据库原理系列(1)---日志系统原理

https://blog.csdn.net/whyangwanfu/article/details/1926367 一:事务系统 1.事务的工作模型 事务必须满足原子性,所封装的操作或者全做或者全不做. 事务管理系统需要做两件事,1)让日志系统产生日志,2)保证多个事务并发执行,满足ACID特性. 事务系统工作模型,见图1. 如图,事务管理管理器控制查询处理器的执行.控制日志系统以及缓冲区.日志在缓冲区生成,日志管理器在一定的时候控制缓冲区的刷盘操作.当系统崩溃的时候,恢复管理器就被激活,检查日