文章目录

  • 一、事务
    • 1、事务介绍
    • 2、事务组成
    • 3、事务结束
    • 4、MySQL事务处理
    • 5、保存点与回档
    • 6、事务隔离级别
    • 7、脏读、不可重复读、幻读

一、事务

1、事务介绍

事务,也称工作单元,是由一个或多个SQL语句所组成的操作序列。

这些SQL语句作为一个完整的工作单元,要么全部成功,要么全部失败

通过事务来保证数据的一致性。


就比如说转账,A转给了B一共100元,那么A就要减少100元,B就要增加100元。

也就是说下面两条SQL语句要么全部成功,要么全部失败,不能存在中间状态。

update A set s = s-100;
update B set s = s+100;

事务有以下特点:

  • 原子性
    事务要么全部成功,要么全部失败。
  • 一致性
    一旦事务完成(不论成功还是失败),整个系统处于数据一致的状态。
  • 隔离性
    一个事务的执行不会被另一个事务所干扰。
    比如两个人同时从一个账户取钱,应当保证余额正确。
  • 永久性
    事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

2、事务组成

一个事务可以由以下任意一种形式组成:

  • 一组相关的DML、DQL语句,再加上一个TPL语句(commitrollback
  • 一组相关的DML、DQL语句,再加上一个DDL语句(createalterdroptruncate……)
  • 一组相关的DML、DQL语句,再加上一个DCL语句(grantrevoke

3、事务结束

显式结束

  • TPL语句
    commit——提交
    rollback——回滚

隐式结束

  • 隐式提交
    DDL语句——createalterdroptruncaterename
    DCL语句——grantrevoke
  • 隐式回滚
    客户端强制关闭
    客户端连接异常
    系统崩溃

4、MySQL事务处理

方法一:通过beginrollbackcommit来实现

  • beigin——开始一个事务
  • rollback——事务回滚
  • commit——事务提交

方法二:直接set改变MySQL的自动提交样式

MySQL默认自动提交,也就是提交一个SQL就直接执行。

  • set autocommit = 0——禁止自动提交
  • set autocommit = 1——开启自动提交

set autocommit = 0之后,所有的SQL语句都将作为事务处理,直到用commit/rollback结束

注:MySQL只有InnoDB引擎支持事务。

5、保存点与回档

想要回滚到指定位置,而不是回滚到事务的起点,可以通过savepoint来实现

savepoint 保存点名;  -- 定义一个保存点
rollback to 保存点名;  -- 回滚到指定保存点

注:savepointrollback to两个语句都不会结束事务的执行

6、事务隔离级别

隔离级别 英文 备注
读未提交 read uncommitted 一般不用,没有隔离,存在“脏读”问题
读提交 read committed Oracle默认
解决了“脏读”问题
存在着“幻读”问题
可重复读 repeatable read MySQL默认
同时解决了脏读和幻读
串行化 serializable 用得很少,并发性差

可以通过以下SQL语句来查看MySQL当前会话的事务隔离级别

select @@tx_isolation;

MySQL可重复读举例

虽然网上总是流传着事务隔离级别为“可重复读”的时候会同样存在着“幻读”的问题,但是也有说法指出,MySQL的InnoDB引擎实现的“可重复读”通过mvcc机制避免了这种幻读现象。从上面的例子来看,后者的说法应该更为准确一些。

7、脏读、不可重复读、幻读

可以参考这位博主的见解——https://www.cnblogs.com/yubaolee/p/10398633.html


脏读

脏读就是指,当事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,事务B也访问这个数据,然后使用了这个数据。

因为这个数据是还没有提交的数据,那么事务B读到的这个数据是脏数据。

依据脏数据所做的操作可能是不正确的。


不可重复读

不可重复读可以理解为,当事务A第一次查询某个表T的某个记录,得到一个记录R1,然后事务B对刚刚查询的同一条记录进行了更新,再然后事务A第二次进行了同样的查询,得到了一个记录R2,发现R2与R1不同。

在这种情况下,如果事务A和事务B对同一条记录进行了更新,后完成的事务会造成先完成的事务的丢失。


幻读

幻读可以理解为,当事务A第一次查询某个表T,得到了一个结果集S1,然后事务B对表T增加/删除/修改了某个/某些数据,再然后事务A第二次进行了同样的查询,得到了一个结果集S2,发现S2与S1不同。

虽然看上去和不可重复读差不多,但是幻读强调结果集合的增减,不单单只是一条记录。

《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】相关推荐

  1. 阿里云原生数据仓库AnalyticDB MySQL版学习

    阿里云原生数据仓库AnalyticDB MySQL版是融合数据库.大数据技术于一体的阿里云原生企业级数据仓库服务.AnalyticDB MySQL版支持高吞吐的数据实时增删改.低延时的实时分析和复杂E ...

  2. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·001【数据库基本概念、MySQL安装与介绍】

    文章目录 一.数据库基本概念 1.DB与DBMS 2.数据库系统的构成 3.数据管理发展过程 4.数据库 5.关系型数据库 二.MySQL安装与卸载 三.与MySQL相关的常用命令 四.MySQL相关 ...

  3. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·007【简单查询】

    文章目录 一.select语句 1.作用 2.语法 3.空值处理 4.反引号.单引号.双引号 5.列和表的别名 6.distinct去重 7.查询表结构 8.条件查询 (1).限定条件 (2).常用比 ...

  4. 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·007

    问题描述 1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪.2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得 (不考虑奖金部分,年薪的试用期6个月的月薪+转 ...

  5. 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·006

    文章目录 问题列表 参考解答 前提补充 注意点整理 分解代码 整体代码 问题列表 1.使用如下语句,建立以下表 create table copy_emp (empno int(4),ename va ...

  6. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·005【表的CRUD操作(DML语句)】

    文章目录 一.表的CRUD操作(DML语句) 1.insert语句 2.update语句 3.delete语句 二.其他注意点 1.MySQL查询区分大小写的方式 2.truncate语句与delet ...

  7. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·011【视图和索引】

    文章目录 一.视图 1.介绍 2.作用 3.使用示例 4.视图上的DML操作 二.索引 1.介绍 2.作用 3.分类 4.创建 4.删除 5.验证 一.视图 1.介绍 视图是指计算机数据库中的视图,是 ...

  8. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·010【高级查询】

    文章目录 一.分组函数(聚合函数) 1.介绍 2.格式 3.常用函数 (1).MIN函数.MAX函数 (2).SUM函数.AVG函数 (3).COUNT函数 4.group by子句 5.having ...

  9. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·008【常用函数】

    文章目录 一.常用函数 1.建议 2.MySQL函数概述 3.常用函数分类 一.常用函数 1.建议 使用函数时,建议将MySQL升级为8.0版本 2.MySQL函数概述 单行函数 语法 函数名(参数列 ...

最新文章

  1. C语言结束输入(两种方法)
  2. 图解:电商支付架构设计
  3. ARM与RISC-V之争,后起之秀的优势在哪儿?
  4. [NOIp提高组2017]宝藏
  5. Hive_ 对比分区,分桶
  6. 测试计划(GB8567——88)
  7. 前端学习(1365):express框架导读
  8. 论文学习10-Joint entity recognition and relation extraction as a multi-head selection problem(实体关系联合抽取模型
  9. SpringBoot使用ResponseBodyAdvice进行统一响应处理
  10. GCC options总结
  11. oracle rac 启动失败has,oracle11.2.0.4 rac asm启动故障
  12. 13.xsi:schemaLocation详解
  13. bash给脚本加进度条_shell脚本实现进度条
  14. 【路径规划】基于matlab A星+改进A星的路径规划【含Matlab源码 225期】
  15. 我转行程序员的那一年(四)
  16. 阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用
  17. 《人月神话》出版后的网友评论
  18. JPA如何查询部分字段
  19. 攻击机靶机环境搭建——网络设置
  20. windows10下安装Vue.js的方法

热门文章

  1. 1核1g java_wordpress博客1核1G1M够用吗
  2. java 扫描自定义注解_利用spring 自定义注解扫描 找出使用自定义注解的类
  3. android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView
  4. php 8发布,PHP 8.0.0 正式版发布啦,一个崭新时代来临!
  5. mysql5.5.48安装教程_Linux虚拟机下MySQL-server-5.5.48-1安装教程
  6. 用java制作心理测试软件_Java 程序员必备的10款开源工具
  7. c语言中常用符号,C语言中常用的符号.doc
  8. linux下mysql5.7创建用户_Linux下mysql5.7 创建、删除用户与授权
  9. Iranian ChamPions Cup 水题
  10. 《深度学习笔记》——loss函数的学习笔记