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

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

假设要张三通过银行给李四进行转账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. java并发编程实战《六》等待-通知机制

    用"等待-通知"机制优化循环等待 前言 在破坏占用且等待条件的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待. 1 // 一次性申请转出账户和 ...

  2. 你说说对Java中SPI的理解吧

    前言 最近在面试的时候被问到SPI了,没回答上来,主要也是自己的原因,把自己给带沟里去了,因为讲到了类加载器的双亲委派模型,后面就被问到了有哪些是破坏了双亲委派模型的场景,然后我就说到了SPI,JND ...

  3. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一.    类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...

  4. 第6.4节 Python动态表达式计算:eval函数详述

    在Python动态执行的函数中,eval是用于执行表达式计算的函数,这个函数用于执行字符串中包含的一个表达式或其编译后对应的代码,不能适用于执行Python语句和完整的代码. 一.    语法 1.  ...

  5. 第6章 Python中的动态可执行方法 第6.1节 Python代码编译

    在介绍动态可执行方法前,本节先介绍一下Python代码编译有关的知识,因为部分内容和动态执行有些关联. 一.    Python解释器的功能 Python虽然是解释型语言,但Python代码也是可编译 ...

  6. PyQt Designer中带参数的信号为什么匹配不到带参数的槽函数?

    老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...

  7. SQL实现_同时在线人数

    原始数据表结构如下: user_id login_time logout_time 12 2020-12-10 20:45:18 2020-12-10 21:45:18 只说下实现思路,SQL不太难, ...

  8. MVC-采用Bundles方式引入css和js文件

    优点:修改js或css时会自动生成hash版本号. 缺点:需要在BundleConfig中先添加对应的文件,然后在html中再引用对应的bundle,多操作了一步. web.config中 <c ...

  9. QQ电话能定位

    QQ电话是网络电话,可以定位吗??? 下面介绍利用wireshark获取QQ好友IP实施精准定位 超详!! Wireshark Wireshark是一个使用WinPcap作为接口,直接与网卡进行数据报 ...

  10. MySQL 5.7.29安装配置

    一.环境准备(关闭防火墙) 1.清除已安装数据库 [root@mysql01 ~]# rpm -qa | grep mariadb mariadb-libs-5.5.35-3.el7.x86_64 [ ...