事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。

我们先举一个例子来描述一下事务:

假设要张三通过银行给李四进行转账1000元钱,张三原有余额10000元整,李四有人民币3000元整。

以下是操作流程:

时间 t1       检查张三余额是否够转账

时间 t2      从张三中扣除1000元

时间t3       在李四的账户中添加1000元

在上述的步骤的操作必须打包在一个事务-转账,我们可把它描述为这个事务程序:

t0    开始事务

t1    SELECT balance FROM account_tab WHERE account_name='张三'' ;

t2    UPDATE account_tab SET balance=balance-1000 WHERE  account_name='张三'' ;

t3   UPDATE account_tab SET balance=balance+1000 WHERE  account_name='李四'' ;

t4  COMMIT;

我们假设在t3李四的账户中添加1000元发生失败,则这次转账业务失败,我们需要数据回滚到最初始状态。

将扣除的1000元钱回滚给张三的账户,否则后果不堪设想。

要满足事务开发中的准确性,那么在数据库事务程序不可不理解事务的四大特性【ACID】

    

  • 原子性(atomicity)

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对一个事务来说,不可能

只执行其中的一部分操作,这是事务的原子性。

  • 一致性(consistency)

数据库总数从一个一致性的状态转换到另外一个一致性状态。以转账为例,如果在t3出现错误,事务没有提交,所欲事务做的修改就不会保存到数据库。确保了数据的一致性。

  • 隔离性(isolation)

通常说,一个事务所做的修改在最终提交前,对其它事务不可见的。它由一些隔离机制来控制。

  • 持久性(durability)

一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统奔溃,修改的数据也不会丢失。

在四大特性中影响我们开发的主要以隔离性为主,接下来我们看看数据库的隔离性:

脏读(读取未提交数据)READ UNCOMMITED

          在事务的修改即使没有提交也是对其它事务可见的。事务可以读取未提交的数据。这个级别的事务隔离会导致很多问题。

         B事务读取A事务尚未提交的数据,此时如果A事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。举例如下

       不可重复读

        两次读取的内容不一致

      幻读

        当某个事务在读取某个范围内的记录时另外一个事务对该范围内插入了新的记录。

不可重复读“和“幻读”的区别

  • 不可重复读是读取了其他事务更改的数据
  • 幻读是读取了其他事务新增的数据

数据库零基础之---了解数据库的事务[ACID]的更多相关文章

  1. 数据库开发基础 SQL Server 数据库的备份、还原与分离、附加

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是 一.在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点 二. ...

  2. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

  3. 2020年数据库概念与MySQL的安装与配置-从零基础入门MySQL-mysql8版本

    作者 | Jeskson 来源 | 达达前端小酒馆 从零基础入门MySQL数据库基础课 数据的概念,简介,安装与配置,Windows平台下MySQL的安装与配置. 数据库的概念:数据库是一个用来存放数 ...

  4. Java应用程序连接数据库--JDBC基础

    Java应用程序连接数据库--JDBC基础   Java应用程序连接数据库–JDBC基础 <!-- MySQL驱动,连接数据库用,由数据库厂商提供 --> <dependency&g ...

  5. ylb: 数据库操作方法基础

    ylbtech-SQL Server:SQL Server-数据库操作方法基础 数据库操作方法基础. ylb: 数据库操作方法基础 返回顶部 ----------试图操作(view)--------- ...

  6. Sql基础(零基础学数据库_SqlServer版)

    刚开始学C#时候的笔记,只是些基础的语句如有错误请批评指正,谢谢,(使用SqlServer2012以上) 一.  数据库概述 SQI全称 structrued Query Language 1.数据: ...

  7. 数据库MySQL(带你零基础入门MySQL)

    (一)认识数据库 redis默认端口:6379 mysql默认端口:3306 什么是数据库? 数据库的英文单词:data base,简称DB. 数据库实际上就是一个文件集合,是一个存储数据的仓库,本质 ...

  8. 🚴‍♂️全套MySQL数据库教程_Mysql基础入门教程,零基础小白自学MySQL数据库必备教程☔ #002 # 第二单元 MySQL数据类型、操作表#

    二.本单元知识点概述 (Ⅰ)知识点概述 二.本单元教学目标 (Ⅰ)重点知识目标 1.Mysql的数据类型2.如何选择数据类型3.创建表4.修改表5.删除表 (Ⅱ)能力目标 1.熟练创建数据库及删除数据 ...

  9. 零基础学Python--------第11章 使用Python操作数据库

    第11章 使用Python操作数据库 11.1 数据库编程接口 在项目开发中,数据库应用必不可少.虽然数据库的种类有很多,如SQLite.MySQL.Oracle等,但是它们的功能基本都是一样的,为了 ...

随机推荐

  1. 数据库事务ACID/隔离级别

    参考博客 1. 事务的定义 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一组SQL语句或整个程序 ...

  2. MongoEngine模块

    今儿,接到老的的要求,要把新功能的数据存放在Mongo里.虽然一直都有听过Mango的鼎鼎大名,但是那也只是见过没用过,跟个小白没啥区别.在加上功能急需,没办法只能赶鸭子上架先上再说.下面这篇就是我赶 ...

  3. IDEA无法识别src目录

    如图 如此 即可 -------------------------------------------------------------------- 另一种办法是:让IDEA识别出module, ...

  4. opencv-python imread、imshow浏览目录下的图片文件

    ☞ ░ 前往老猿Python博文目录 ░ 一.几个知识点 1.1.使用Python查找目录下的文件 具体请参考<Python正则表达式re模块和os模块实现文件搜索模式匹配>. 1.2.o ...

  5. moviepy音视频开发:audio_fadein、fadeout实现声音淡入淡出

    ☞ ░ 前往老猿Python博文目录 ░ 一.概述 为了支持一些常规的音频变换处理,moviepy提供了一系列常用的变换函数,开发者可以直接使用这些方法进行变换,这些函数都在moviepy.audio ...

  6. PyQt(Python+Qt)学习随笔:Model中项的标记flags取值及枚举类型Qt.ItemFlag

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在Model中的项可以通过flags()方法查询对应项是否能被选择.拖拽或其他操作,对应的返回值类型 ...

  7. 第十二章、Designer中的menu菜单、toolBar工具栏和Action动作

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 Qt Designer中的部件栏并没有菜单.toolBar以及Action相关的部件,仅在 ...

  8. PyQt(Python+Qt)学习随笔:Action功能详解及Designer中的操作方法

    老猿Python博文目录 老猿Python博客地址 一.引言 Qt Designer中的部件栏并没Action相关的部件,Action可以在右侧的Action Editor中编辑,如图: 如果没有出现 ...

  9. NET CORE通过NodeService调用js

    在 .NET Framework 时,我们可以通过V8.NET等组件来运行 JavaScript,不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core ,我们如何在 .NET C ...

  10. Jenkins Job间传递参数的一种方法

    场景: Jenkins 中可以建多个Job,一般是主编译Job,多个子Job. 子Job要用主Job中的版本号,编译号. 1)  在主Job里面添加脚本命令: echo set MainVersion ...