【MySQL】 事务

Metadata

title: 【MySQL】 事务
date: 2023-06-25 09:25
tags:
  - 行动阶段/完成
  - 主题场景/数据存储
  - 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
  - 细化主题/数据存储
categories:
  - 数据存储
keywords:
  - 数据存储
description: 【MySQL】 事务

事务的起源

举例

银行为了存储人们的账户信息会建立一个account 表:

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;

每一个操作都相当于现实世界中账户的一次状态转换

UPDATE account SET balance = balance - 10 WHERE id = 1;
UPDATE account SET balance = balance + 10 WHERE id = 2;

让某些数据库操作符合现实世界中状态转换的规则

原子性(Atomicity)

事务是一个不可分割的操作单元,要么全部执行成功,要么全部失败回滚。如果事务中的任何一步操作失败,则整个事务都会被回滚到最初的状态,保证数据的一致性。

隔离性(Isolation)

多个事务并发执行时,每个事务的操作应该与其他事务的操作相互隔离,互不干扰。每个事务在执行期间所做的修改对其他事务是不可见的,直到事务提交。

示例

步骤一:读取狗哥账户的余额到变量A中,这一步骤简写为read(A) 。
步骤二:将狗哥账户的余额减去转账金额,这一步骤简写为A = A - 5 。
步骤三:将狗哥账户修改过的余额写到磁盘里,这一步骤简写为write(A) 。
步骤四:读取猫爷账户的余额到变量B,这一步骤简写为read(B) 。
步骤五:将猫爷账户的余额加上转账金额,这一步骤简写为B = B + 5 。
步骤六:将猫爷账户修改过的余额写到磁盘里,这一步骤简写为write(B) 。

实际

一致性(Consistency)

事务执行前后,数据库的完整性约束必须保持一致。

每一笔交易完成后,都需要保证整个系统的余额等于所有账户的收入减去所有账户的支出。

数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果。

持久性(Durability)

一旦事务提交,其所做的修改将永久保存在数据库中,即使系统发生故障也不会丢失。系统保证已提交的事务对数据库的修改是永久性的。

事务的概念

把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务(英文名是: transaction )

叔根据这些操作所执行的不同阶段把事务大致上划分成了这么几个状态:

  • 活动的(active)

事务对应的数据库操作正在执行过程中时,我们就说该事务处在活动的状态。

  • 部分提交的(partially committed)

当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。

  • 失败的(failed)

当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,我们就说该事务处在失败的状态。

  • 中止的(aborted)

。当回滚操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,我们就说该事务处在了中止的状态。

  • 提交的(committed)

当一个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态。

只有当事务处于提交的或者中止的状态时,一个事务的生命周期才算是结束了。

MySQL中事务的语法

开启事务

BEGIN [WORK];

BEGIN 语句代表开启一个事务,后边的单词WORK 可有可无。开启事务后,就可以继续写若干条语句,这些语句都属于刚刚开启的这个事务。

START TRANSACTION;

START TRANSACTION 语句和BEGIN 语句有着相同的功效,都标志着开启一个事务

可以在START TRANSACTION 语句后边跟随几个修饰符

  • READ ONLY
    标识当前事务是一个只读事务,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。

  • READ WRITE
    标识当前事务是一个读写事务,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。

  • WITH CONSISTENT SNAPSHOT
    启动一致性读

提交事务

COMMIT [WORK]

手动中止事务

ROLLBACK [WORK]

支持事务的存储引擎

目前只有InnoDB 和NDB 存储引擎支持

自动提交

MySQL 中有一个系统变量autocommit

隐式提交

导致事务隐式提交的语句包括:

  • 定义或修改数据库对象的数据定义语言(Data definition language,缩写为: DDL )。
  • 隐式使用或修改mysql 数据库中的表
  • 事务控制或关于锁定的语句
  • 加载数据的语句
  • 关于MySQL 复制的一些语句
  • 其它的一些语句

保存点

保存点(英文: savepoint )的概念

在事务对应的数据库语句中打几个点,我们在调用ROLLBACK 语句时可以指定会滚到哪个点,而不是回到最初的原点

定义保存点的语法如下:

SAVEPOINT 保存点名称;

当我们想回滚到某个保存点时,可以使用下边这个语句(下边语句中的单词WORK 和SAVEPOINT 是可有可无的):

ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;

如果我们想删除某个保存点,可以使用这个语句:

RELEASE SAVEPOINT 保存点名称;