MySQL事务

为什么需要事务?

        试想一种场景,张三给李四转账200元,完成这一转账需求需要执行两部操作,分别是对张三余额减200和对李四余额加200。

        在这两步操作中,任何一步出现异常显然都是很危险的。也就是说转账时只能出现两种情况,要么转账成功,要么转账失败。在此案例中这两步操作可构成一个事务。

事务

        在MySQL中,多个 dml(update, insert, delete)语句当做一个整体,要么都执行成功,要么都执行失败。

        没有select语句是因为查询语句不会读数据造成影响。

四个特性

事务是必须满足4个条件(ACID):原子性(也称 不可分割性)、一致性、隔离性(也称 独立性)、持久性。

  • 原子性(Atomicity):一个事务(transaction)中的所有操作是一个整体,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  • 一致性(Consistency):事务必须是数据库从一个一致性状态变换到另一个一致性状态。

  • 隔离性(Isolation):多个用户并发访问数据库时, 数据库为每一个用户开启的事务, 不能被其他事务的操作数据所干扰, 多个并发事物之间要相互隔离。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性(Durability):一个事务一旦提交之后,对数据的修改就是永久性的,即便系统故障也不会丢失。

MySQL中事务状态

在 MySQL 的事务默认都是自动提交的,也就是说执行 SQL 语句后就会马上执行 COMMIT 提交操作。所以需要手动开启事务,或将MySQL设置为手动提交事务。

MySQL事务重要控制语句

  • start transaction -- 开始一个事物
  • savepoint 保存点名 -- 设置保存点
  • rollback to 保存点名 -- 回退事务
  • rollback -- 回退全部事务
  • commit -- 提交事务, 所有的操作生效, 不能回退

代码示例

创建表t

CREATE TABLE t(
	id INT,
	`name` VARCHAR(32)
)

开启事务

方式1

START TRANSACTION

方式2

BEGIN

执行 dml 操作添加记录

INSERT INTO t VALUE (20, 'JSON')

设置保存点a

SAVEPOINT a

再次添加记录

INSERT INTO t VALUE (30, '张三')

回滚

-- 回滚a
ROLLBACK TO a

-- 回滚b
ROLLBACK TO b

-- 全部回滚, 回退到事务开始的状态
ROLLBACK

提交

-- 提交(结束)事务, 提交后不能回滚, 同时删除已设置的保存点
COMMIT

提交事务

        使用commit语句可以提交事务。当执行了commit 语句后,会确认事务的变化,结束事务,删除保存点,释放锁,数据生效。当使用 commit 语句结束事务后, 其他会话(其他连接)将可以看到事务变化后的新数据(所有数据正式生效)

注意事项

  1. 开启事务之后如果没有设置(创建)保存点,可移执行 ROLLBACK 回滚,默认是回退到事务开始的状态。
  2. 事务中创建多个保存点,在没有提交的情况下,可以创建多个保存点,注意:当有多个保存点时,如果回滚到前面的保存点,将删掉在这个保存点之后的保存点。
  3. 在事务没有提交之前,可以选择回退到存在的保存点 ROLLBACK TO 保存点。
  4. Innodb 存储引擎支持事务,MyISAM不支持

修改MySQL默认提交事务方式

-- 关闭
SET autocommit=off
SET autocommit=0

-- 打开
SET autocommit=ON
SET autocommit=1

相关推荐

  1. Mysql事务

    2024-07-12 17:10:04       75 阅读
  2. MySQL 事务

    2024-07-12 17:10:04       52 阅读
  3. MySQL事务

    2024-07-12 17:10:04       47 阅读
  4. MySQL事务

    2024-07-12 17:10:04       44 阅读
  5. Mysql事务

    2024-07-12 17:10:04       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 17:10:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 17:10:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 17:10:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 17:10:04       69 阅读

热门阅读

  1. C语言阶乘(只用逻辑运算中的短路效应判断)

    2024-07-12 17:10:04       20 阅读
  2. numpy 解释函数nanmax

    2024-07-12 17:10:04       21 阅读
  3. AIGC:AI创作短片-流程以及工具介绍(学习笔记)

    2024-07-12 17:10:04       22 阅读
  4. NLP简介

    NLP简介

    2024-07-12 17:10:04      20 阅读
  5. Linux 内核中的 Makefile 和 Kconfig:深入理解与实践

    2024-07-12 17:10:04       18 阅读
  6. 【Cesium开发实战】淹没分析功能的实现

    2024-07-12 17:10:04       19 阅读
  7. 人生低谷来撸C#--007 结构体

    2024-07-12 17:10:04       23 阅读
  8. 自然语言处理:项目推荐

    2024-07-12 17:10:04       23 阅读