第 18 章 从猫爷借钱说起——事务简介

56 阅读2分钟

18.1 事务的起源

CREATE TABLE account (
id INT NOT NULL AUTO_INCREMENT COMMENT '自增id',
name VARCHAR(100) COMMENT '客户名称',
balance INT COMMENT '余额',
PRIMARY KEY (id)
) Engine=InnoDB CHARSET=utf8;
insert into account (name, balance) values ('狗哥', 11), ('猫爷', 2);

18.1.1 原子性(Atomicity)

不可分割,要么全做,要么全不做。

18.1.2 隔离性(Isolation)

访问相同数据的不同操作之前互相隔离,互不影响——线程安全

18.1.3 一致性(Consistency)

数据库世界是现实世界的一个映射,现实世界中存在的约束也要在数据库世界中体现。如果数据库中的数据全部符合现实世界中的约束,我们说这些数据就是一致的,或者说符合一致性的。

18.1.4 持久性(Durability)

当一个状态转换完成后,这个转换结果将永久保留。

18.2 事务的概念

保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务(transaction)。

事务状态描述
活动的(active)事务应对的数据库操作正在执行过程中
部分提交的(partially committed)事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时
失败的(failed)事务处在活动的或部分提交的状态时,遇到了某些错误而无法继续执行,或人为停止当前事务的执行
中止的(abort)失败后回滚完成
提交的(committed)处在部分提交的状态的事务同步到磁盘上后

在这里插入图片描述

18.3 MySQL中事务的语法

18.3.1 开启事务

BEGIN;
START TRANSACTION [option];
  1. READ WRITE:读写事务
  2. WITH CONSISTENT SNAPSHOT:一致性读

18.3.2 提交事务

COMMIT;

18.3.3 手动中止事务

ROLLBACK;

18.3.4 支持事务的存储引擎

目前只有 InnoDB 和 NDB 。

18.3.5 自动提交

SHOW VARIABLES LIKE 'autocommit';

在这里插入图片描述

默认情况下,如果不显式开启事务,那么每一条语句都算是一个独立的事务。这种特性称为自动提交

18.3.6 隐式提交

开启事务后,虽然没有手动提交,但因为输入了某些语句导致事务被偷偷提交。

  1. 定义或修改数据库对象的DDL
  2. 隐式使用或修改 mysql 库中的表
  3. 事务控制或关于锁定的语句
  4. 加载数据的语句
  5. 关于 MySQL 复制的一些语句
  6. 其他一些语句

18.3.7 保存点

savepoint,在事务对应的数据库语句中打几个点,回滚时可以指定回滚到某个点。

18.4 总结

  1. 事务指需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作
  2. 事务的执行状态包括活动的、部分提交的、提交的、失败的、中止的。