关系型数据库 事务_简述事务的概念

关系型数据库 事务_简述事务的概念一、基本概念 假设用户A要从他的账户里面给B转账1000元,那么就需要两步来实现,首先从A的账号减去1000元,再给B账号加1000元。这两个步骤中,任何一步都不能少或者出错,这两步要么都得到成功操作

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

一、基本概念

  假设用户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 就是所有的事务都是串行执行的,一个事务执行完了,再接着执行其它的事务。这样可以解决以上说有并发问题,但是因为通过大量的加锁来实现的,所以效率很低。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10346.html

(0)
上一篇 2022-12-29
下一篇 2022-12-29

相关推荐

  • MySQL索引:B+树索引「建议收藏」

    MySQL索引:B+树索引「建议收藏」MySQL索引:B+树索引 B+树索引是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。B+树索引的构造类似于二叉树,根据键值快速找到数据 B树 B+树是由B树演化而来的,在

    2023-04-30
    149
  • 搭建redis哨兵模式[亲测有效]

    搭建redis哨兵模式[亲测有效]一、工具说明 操作系统:CentOS8 Redis:3.2.8 二、安装redis 下载redis [root@localhost ~]$ wget http://download.redis.io…

    2023-02-15
    152
  • 用Python实现数字处理和计算

    用Python实现数字处理和计算Python可以用来进行数字处理和计算,它既可以进行基本的算术运算,还可以进行科学计算、数据分析和可视化等操作。下面从多个方面介绍如何用Python实现数字处理和计算。

    2024-01-06
    107
  • Redis是什么_服务器环境搭建一篇就够了

    Redis是什么_服务器环境搭建一篇就够了在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在

    2022-12-22
    153
  • [学习笔记] Oracle字段类型、建表语句、添加约束

    [学习笔记] Oracle字段类型、建表语句、添加约束SQL语句介绍 数据定义语言(DDL),包括 CREATE、 ALTER、 DROP等。 数据操纵语言(DML),包括 INSERT、 UPDATE、 DELETE、 SELECT … FOR UPD

    2023-02-03
    142
  • 达梦数据库sql语法_数据库基本语法

    达梦数据库sql语法_数据库基本语法数据库-SQL 语法 二十余年如一梦,此身虽在堪惊。 简介:数据库-SQL 语法 一、基础 模式定义了数据如何存储、存储什么样的数据以及数据如何分解等信息,数据库和表都有模式。 主键的值不允许修改,也

    2023-04-19
    171
  • mysql体系架构有哪几层_sql去重保留一条

    mysql体系架构有哪几层_sql去重保留一条对于一个服务端开发来说 MYSQL 可能是他使用最熟悉的数据库工具,然而,大部分的Java工程师对MySQL的了解和掌握程度,大致就停留在这么一个阶段:它可以建库、建表、建索引,然后就是对里面的数据进

    2023-06-06
    157
  • Spyder汉化教程

    Spyder汉化教程Spyder是一款开源Python集成开发环境(IDE),简单易用,功能强大,适用于数据分析、机器学习、科学计算等领域。但是,官方版本的Spyder是英文界面,因此对于不懂英文的用户来说可能会带来一定的困扰。本篇文章将教大家如何将Spyder汉化,方便使用。

    2024-06-19
    52

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注