事务:基础篇

事务:基础篇

事务知识体系

事务的主要内容可以从以下几个问题来解决:

事务的所有内容基本都包含在这些问题中,相比于索引来说会更加重要

注:这里是按照 MySQL 中的事务来讲述的,其他数据库中的事务可能存在些微出入

初识事务

什么是事务?为什么需要事务?

简单来说事务就是一组数据库操作或者说一组 SQL 集合,这组 SQL 集合要么全部执行成功,要么全部都不执行;主要的目的就是保证数据库在执行 SQL 时数据的一致性和完整性

如果不能理解事务的定义的话,那么接下来这个非常经典的转账例子应该能够让你大致理解事务这个概念:

如果没有事务的话,在我们的账户拥有 100 元的情况下给某个人转账,由于转账的过程中系统需要完成非常多的操作,可能没有办法立刻完成转账的行为;此时我们查询账户余额就会发现账户余额依然是 100 元,如果此时我们打算再给其他人转账,那么最终就可能导致账户余额显示为负数,这就破坏了数据的一致性

事务是如何启动的?

  • start transaction / begin:事务要等到第一个 DQL 执行的时候才会启动,也就是视图才真正创建
  • start transaction with consistent snapshot:事务立刻启动,也就是事务立刻创建
  • set autocommit:设置自动开启事务,之后不需要再手动声明事务,但是需要手动提交,容易导致长事务
  • commit:事务提交
  • rollback:事务回滚

注:如果不能理解这里开启事务的区别,可以等到了解 MVCC 机制之后再倒回来看

事务特性

事务有哪些特性?具体是如何实现的?

事务的 ACID 特性:

事务 ACID 具体实现:

隔离级别

注:事务隔离级别的具体实现会在之后的原理篇中提到,因为会涉及到非常多的内容,这里就暂且不去展开

为什么需要事务的隔离级别?

简单来说,就是此前提到的为了防止多个事务并发执行时由于交错执行带来的数据不一致的问题

具体来讲主要分为以下两类问题:

提交覆盖,回滚覆盖 > 脏读 > 不可重复读 > 幻读

因为每种问题的严重性也都是不同的,所以如果我们能够容忍一些问题的出现,那么就可以获取性能上的提升,这也是为什么要设计四种事务隔离级别的原因

事务的隔离级别有哪些?

注:事务的隔离级别也是典中典的问题,不仅要知道事务隔离级别有哪些,还要知道如何实现的

参考内容:

https://juejin.cn/post/6844904096378404872#heading-5

Mysql学习笔记——事务与隔离级别

https://mp.weixin.qq.com/s/i5QWx3QPZNkV51ghFbtXCw

Author: Fuyusakaiori
Link: http://example.com/2022/05/05/database/mysql/transaction/事务:基础篇/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.