文章目录

  • 1.什么是事务?
  • 2.事务的基本操作
  • 2.事务操作的注意事项
  • 3.事务的隔离级别
    • 3.1 无隔离性的问题
      • 3.1.1 脏读
      • 3.1.2 不可重复读
      • 3.1.3 幻读
    • 3.2 事务的隔离级别
      • 3.2.1 设置事务的隔离级别
      • 3.2.2 查看当前的隔离级别
  • 4.事务的特性
    • 4.1 原子性
    • 4.2 一致性
    • 4.3 隔离性
    • 4.4 持久性

1.什么是事务?

  事务是数据库中一个单独的执行单行(Unit),事务就是由一种数据操纵语言DML语句组成,这一组DML要么全不成功要么全部失败,是一个整体。
  以网上购物为例,其交易过程包括以下几步:

  1. 更新客户所购商品的库存信息
  2. 保存客户付款信息
  3. 生成订单并且保存到数据库中
  4. 更新用户相关信息,例如购物数量等

  在正常情况下,这些操作都将顺利执行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果遇到断电或者是其他意外情况,导致这一系列过程中任何一个环节出了差错(例如在更新商品库存信息时发生异常、顾客银行账户余额不足等),都将导致整个交易过程失败。而一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,例如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态,即原有的库存信息没有被更新,用户也没有付款,订单也没有生成。否则数据库的信息将会不一致,或者出现更为严重的不可预测的后果。

数据库事务正是用来拨正这种情况下交易的平稳性和可预测的技术。

2.事务的基本操作

开始一个事务:start transaction;
创建一个保存点:savepoint 保存点名;
回到保存点:rollback to 保存点

2.事务操作的注意事项

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始,直接使用rollback前提是事务还没有提交
  • 如果一个事务被提交(commit)了,则不可以回滚(rollback)
  • 可以选择回退到哪个保存点
  • InnoDB支持事务,MyISAM不支持事务

3.事务的隔离级别

当我们有多个客户端同时操作数据库的某张表时,如何进行隔离操作?MySQL提供了隔离级别。当MySQL表被多个线程或者客户端开启各自事务操作数据库中的数据时,MySQL提供了一种机制,可以让不同的事务在操作数据时,具有隔离性。从而保证数据的一致性。

3.1 无隔离性的问题

3.1.1 脏读

1、张三的原工资是1000,财务人员将张三的工资改为8000,但是未提交事务
2、张三读取自己的工资,发现是8000,欣喜若狂
3、财务发现操作有误,回滚了事务,张三的工资又变为1000
像这样,张三读取的工资数是8000就是一个脏数据

3.1.2 不可重复读

是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(即不能读到相同的数据内容)

在事务1中,张三读取自己的工资为1000,操作并没有完成
在事务2中,财务将张三的工资改为2000,并提交了事务
在事务1中,张三再次读取自己的工资时,工资变为了2000
解决办法:如果只有在修改事务完全提交之后才可以读数据,则可以避免该问题

不可重复读的重点是修改:同样的条件, 你读取过的数据,再次读取出来发现值不一样了

3.1.3 幻读

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

目前工资为1000的员工有10人
1、事务1,读取所有工资为1000的员工
2、事务2,向表中插入一条员工记录,工资为1000
3、事务1读取所有工资为1000的员工,读取了11条记录
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可以避免该问题

幻读的重点在于新增或者删除:同样的条件, 第1次和第2次读出来的记录数不一样

3.2 事务的隔离级别

3.2.1 设置事务的隔离级别

set session transaction isolation level read uncommitted;

3.2.2 查看当前的隔离级别

select @@tx_isolation;

4.事务的特性

  事务必须满足4个属性,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)即ACID4种属性。

4.1 原子性

  事务是一个不可分割的整体,为了保证事务的总体目标,事务必须具有原子性,即当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成,避免了只执行这些操作的一部分而带来的错误。事务是应用中最小的执行单位,就如原子是自然界的最小颗粒,具有不可再分的特征一样,事务是应用中不可再分的最小逻辑执行体。

4.2 一致性

  一个事务执行之前和执行之后,数据库中数据必须保持一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不确定(不一致)的状态。而例如银行转账,转账前后两个账户金额之和应保持不变。

4.3 隔离性

  隔离性也被称为"独立性",当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与事务的操作隔离起来,不被其他正在执行的事务看到,各个事务的执行互不干扰。也就是说,并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能互相影响。例如对任何一对事务T1和T2,对T1而言,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。

4.4 持久性

  持久性也被称为"永久性",持久性指的是一个事务一旦被提交,它对数据库所做的改变都要记录到永久存储。

什么是事务?事务的基本操作、事务的隔离性问题、事务的ACID特性相关推荐

  1. 理解事务四大特性(Transaction)——原子性、一致性、隔离性和持久性(ACID)

    事务是指对系统进行的一组操作,为了保证系统的完整性,事务需要具有ACID特性,具体如下: 1. 原子性(Atomic) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生. ...

  2. 事务未提交 别人能读取到吗_Mysql 事务-面试笔记

    问题汇总: 什么是事务 事务的特征-ACID 事务的原理 事务隔离级别 并发事务带来的问题 - 数据库隔离现象 不可重复读与幻读的区别 事务隔离机制解决方法 什么是MVCC MVCC是如何工作的 MV ...

  3. mysql支持事务的存储引擎_MySQL基础(三)【MySQL事务与存储引擎】

    3.1-数据库事务 什么是事务 一系列有序的数据库操作: 要么全部成功 要么全部回退到操作前的状态 中间状态对其他连接不可见 事务的基本操作: 基本操作 说明 start transaction 开始 ...

  4. mysql 事务值被改变_面试被问MySQL 事务的实现原理,怎么破?

    Java面试笔试面经.Java技术每天学习一点 作者:小小木的博客 来源:https://www.cnblogs.com/wyc1994666/ 开篇 相信大家都用过事务以及了解他的特点,如原子性(A ...

  5. mysql四种事务级别_【MySQL 知识】四种事务隔离级别

    摘要:本篇文章主要是为了对MySQL的四种事务隔离级别的介绍.为了保证数据库的正确性与一致性,数据库事务具有原子性(Atomicity).一致性(Consistency).隔离性(Isolation) ...

  6. 详述MySQL事务及ACID特性的实现原理

    " 事务是 MySQL 等关系型数据库区别于 NoSQL 的重要方面,是保证数据一致性的重要手段. 本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实 ...

  7. 谈谈MySQL InnoDB存储引擎事务的ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 狼哥一直对数据库Mysql这块没有进行过系统的深入学习,今天看到一篇文章写的还不错,特意分享一下,我不能保证文章中所 ...

  8. 事务四大特征:原子性,一致性,隔离性和持久性(ACID)

    事务四大特征: 原子性,一致性,隔离性和持久性. 1. 原子性(Atomicity) 一个原子事务要么完整执行,要么干脆不执行.这意味着,工作单元中的每项任务都必须正确执行.如果有任一任务执行失败,则 ...

  9. mysql隔离级别 isolation_MySQL事务和隔离级别

    本文以MySQL数据库为蓝本进行讲解- 一 事务是什么 事务'封装'了一系列操作,使得这一系列操作变成了一个最小的工作单元,也可以理解为打包.压缩一起带走-,一起退回- 我理解的事务是:对现实世界中的 ...

最新文章

  1. 一个简单的内核模块实现和使用
  2. 机器学习之用Python从零实现贝叶斯分类器
  3. debian 安装_如何在 Debian/Ubuntu 上手动安装安全更新? | Linux 中国
  4. 获取异常信息e.printStackTrace()的内容
  5. 小心!智能合约再爆高危漏洞,两大加密货币直接变废纸!
  6. 小冰发布全球首款人工智能Office,沈向洋:我们不走寻常路
  7. Java通用工具类之按对象属性排序工具类
  8. PAT(Basic Level)--个位数统计
  9. Linux下安装配置PHP环境(上)---Apache2
  10. x264 x264_slicetype_analyse 函数分析
  11. PCA(主成分分析)的简单理解
  12. 小米air2 pro ota 升级固件
  13. 国家电网与百度达成战略合作,在智慧能源领域掀起新基建热潮
  14. 软件测试判定表测试用例,黑盒测试用例设计方法之判定表法
  15. Postman如何使用(三):使用数据文件【入门到精通】
  16. 导览讲解 | 二维码语音讲解有什么优势?
  17. 如何在Ubuntu系统下使用扫描仪(by quqi99)
  18. 我们能从后验分布中学到什么?贝叶斯后验的频率解释
  19. AutodeskCAD卸载后无法再次安装?完美解决!
  20. AUTH 使用登录验证

热门文章

  1. linux 电脑远程连接wifi,Linux系统下安装mosh来远程连接另一台Linux主机
  2. GIS基本理论之一:GIS的概念、构成结构、功能
  3. 医学图像体渲染照明3 体照明前传之GPU体渲染1
  4. [转贴]英汉习语的文化差异及翻译
  5. java多态实现动物叫唤_Java 多态 ——一个案例 彻底搞懂它
  6. Pytorch实现CapsuleNet
  7. 【部分原创】jquery图表插件flot笔记
  8. chatgpt系列文章-23.2.15(主要还在发现chatgpt的不足,偏探索,像报告)
  9. 现代计算机的二进制算法,源自中国智慧神秘巨著《周易》
  10. js设计模式-装饰器模式