三大关系型数据库事务详解之一:基本概念

一、基本概念

  假设用户A要从他的账户里面给B转账1000元,那么就需要两步来实现,首先从A的账号减去1000元,再给B账号加1000元。这两个步骤中,任何一步都不能少或者出错,这两步要么都得到成功操作完成,要么什么都不做,中途出错也要回滚到转账开始之前的状态。这样的一个过程就是我们经常说的事务。根据这个例子,下来我们就给事务定义如下:

  事务transaction)是为了保证数据的一致性和完整性,由一系列数据操作或指令组成的一个不可分割的逻辑单元,这些操作或指令要么全都得到执行,要么全都不执行。如果事务成功执行,则该事务中对所有数据所做的更改均会成为数据库中持久性更改;如果事务执行过程中遇到错误,则所有执行的操作和更改均应得到取消,回滚到事务执行前的状态。从定义看,事务应该满足四个属性,即ACID,也就是原子性、一致性、隔离性、持久性。

  • 原子性(Atomicity,或称不可分割性):事务中的所有操作,要么全部都成功执行,要么全部都没有执行完成。这种不可中断的一系列操作就是原子性。转账过程中,A账号减去1000元和B账号加1000元,必须都得到执行,或者都不执行,否则都不符合逻辑和实际情况。

  • 一致性(Consistency):事务开始之前和事务完成以后,所有相关的数据状态都会保持一致,不会使数据库的完整性得到破坏。原子性会确保数据保持一致性,转账过程产生中断,第一步执行了,第二步没有执行,这个时候,只是A账号少了1000元,而B账号没有加1000元,这个时候,数据就不一致了。

  • 隔离性(Isolation,又称独立性):数据库中多个并发事务同时执行时,一个事务的执行不能受到其他事务的干扰,也就是说,一个事务内的操作和使用的数据对其他事务是隔离的,不会受到其他并发的事务影响。例如:事务查看数据所处的状态,要么是另一个并发事务的修改之前的状态,要么就是另一个事务修改之后的状态,不会是中间状态的数据。

  • 持久性(Durability):事务执行完后,对数据的修改就是永久的,即便系统出现故障,不会产生回滚,也不会影响到执行结果。

二、事务的运行模式

通常,事务以3种模式运行,他们分别是:自动提交事务、显式事务和隐式事务。

1. 自动提交事务

每一条单独的SQL语句都在其执行完成后进行自动提交事务,即执行 SQL 语句后就会马上自动隐式执行 COMMIT 操作。如果出现错误,则进行事务回滚至之前状态。

2. 显式事务

通过指定事务开始语句来显式开启事务来作为开始,并由以提交命令或者回滚命令来提交或者回滚事务作为结束的一段代码就是一个用户定义的显式事务。

3. 隐式事务

在隐式事务中,无需使用BEGIN TRANASACTION 来开启事务,每个SQL语句第一次执行就会开启一个事务,直到用COMMIT [TRANSACTION]来提交或者ROLLBACK [TRANSACTION]来回滚结束事务。

在ORACLE、MYSQL和SQL SERVER中,这几种模式的开启和关闭方式都有着自己不同的命令,具体命令请参见《关系型数据库事务详解之三:事务运行模式》

三、事务的运行状态

事务在执行过程中有着不同的状态:

1. 活动状态

事务初始和执行时所处于的状态。

2. 部分提交状态

事务执行完最后一条语句,直到操作实际输出全部从内存写入到磁盘这一过程,处于部分提交状态。

3. 提交状态

事务对数据的更改全部写入磁盘,并写入相关事务日志。事务就进入提交状态。

4.失败状态

事务未正常执行完,事务就进入失败状态。这种状态的事务必须回滚。

5. 终止状态

事务进行了回滚,并且数据库已经恢复到事务执行前的状态。这个时候处于终止状态。

四、事务的并发控制

数据库允许多个事务可以同时并发执行。当多个事务同时执行操作同一个数据,会造成以下并发问题:脏读、不可重复读和幻读。

1. 脏读 是指一个事务读取到了另一个事务尚未提交的数据。

2. 不可重复读 是指受到其他事务更改数据的影响,一个事务多次读到的同一个数据的值不一致。

3.幻读 是指因为受到其他事务插入或者删除操作的影响,一个事务读到的两次的数据记录数目不一样。

数据库通过设置隔离级别来应对这几种问题。事务的隔离级别分别4种,按级别从低到高依次是Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

Read Uncommited 就是一个事务在其他事务还没有提交更改时,可以读取数据。这种级别,以上三种并发问题都会出现。

Read Committed 就是一个事务要等其他事务提交后才能读取数据。在这种隔离级别下有可能发生不可重复读和幻读。

Repeatable Read 就是在一个事务开始读取数据时,不再允许其他事务有修改数据的操作。这种级别就不会发生不可重复读,只有可能出现幻读。

serializable 就是所有的事务都是串行执行的,一个事务执行完了,再接着执行其它的事务。这样可以解决以上说有并发问题,但是因为通过大量的加锁来实现的,所以效率很低。

(0)

相关推荐

  • 第20讲:什么是数据一致性与 Saga 模式

    从本课时开始,我将开始介绍跨微服务的协作与查询,这一部分的内容主要涉及微服务之间的交互方式.由于每个微服务一般都各自独立存储数据,所以在不同微服务之间共享数据变得复杂.本课时将讲解微服务架构的应用中的 ...

  • CAP原理

    定义 在一个分布式系统(指系统中的节点互相连接并共享数据)中,当涉及读写操作时,只能保证一致性 (Consistency).可用性 (Availability).分区容错性 (Partition To ...

  • MySQL(一):MySQL数据库事务与锁

    基本概念 事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚.会存在中间态和一致性状态(也是真正在数据库表中存在的状态) ACID Atomi ...

  • 三大常用关系型数据库事务详解之二:基本事务命令

    二.事务基本命令介绍 说明:命令中, | (垂直条) 分隔括号或大括号中的语法项. 只能使用其中一项. [ ](方括号)可选语法项. 不要键入方括号. {}(大括号)必选语法项. 不要键入大括号.   ...

  • 三大常用数据库事务详解之三:事务运行模式

    三.事务的运行模式 通常,事务以3种模式运行,他们分别是: 1. 自动提交事务 每一条单独的SQL语句都在其执行完成后进行自动提交事务,即执行 SQL 语句后就会马上自动隐式执行 COMMIT 操作. ...

  • 三大特点剖析丨详解2020年度国企混改方式

    2020年6月30日,中央深改委审议通过<国企改革三年行动方案>,对未来三年国企改革各项重点任务明确了时间表.路线图. 在这样一个特殊时期,国有企业混合所有制改革有哪些突出热点和亮点? 知 ...

  • Python使用pyodbc访问数据库操作方法详解

    本文实例讲述了Python使用pyodbc访问数据库操作方法. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc,另一种是使用win32com.client,测试了很多遍,最终只有py ...

  • 新公司初始建账的三大原则与流程详解

    对于新成立的公司来说初始建账颇为关键也是一个让众多企业会计觉得棘手的难题. 据上海代理记账机构天尚行集团的总结分析企业初始账的建立都应该遵循以下几个基本原则 第一.会计人员应该依据规模和所属行 ...

  • 浮游矶钓三大基本钓组详解

    浮游矶钓是海钓里面一种十分常见的钓法,它所使用的钓组比起平常的钓法更加复杂,搭配也更加多样,下面就介绍最常用的最基础的3种浮游矶钓的钓组搭配方式给大家参考一下,希望能够对大家更加深刻理解浮游矶钓钓组以 ...

  • 数据库索引详解

    什么是索引 索引是对 数据库中一列或者多列的值进行排序的一中结构,使用索引可以快速访问数据库中表的特定信息.索引的一个主要的目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录的 ...

  • 概念详解03 | 帝国主义概念考析

    编者按 历史概念是理解历史本质的关键.本专栏特选取历史教学中的若干重要概念,对于其含义.起源和演变的探究进行解析,希望对于一线历史教学有所助益. ✎原载 |历史教学(高校版)2007年第2期 ✎作者  ...

  • 我们为何会 “芯” 痛?一文详解芯片基本概念

    打开凤凰新闻,查看更多高清图片 硅基光电子芯片是目前半导体芯片发展的最高级阶段. 电子和光子在半导体中独立运作或者相互作用奠定了不同芯片的基础.芯片不仅扮演了现代产业心脏的角色,也给人类社会带来了各种 ...