MySQL—事务

目录

1.事务的简介:

2.使用事务

[2.1 开启事务](#2.1 开启事务)

[2.2 自动提交](#2.2 自动提交)

[2.3 使用范围](#2.3 使用范围)

[2.4 事务的属性](#2.4 事务的属性)


1.事务的简介:

介绍事务之前,我们先来看一个经典的场景:银行转账。

假如a想要把自己的账户上的10万块钱转到b账户上,这时就需要先从a账户中扣除10万元,再给b账户上加上10万元。

如果从a账户中扣除10万元时发生了错误,会出现什么情况嫩?结果可能导致一下两种情况。

  • a账户中的10万元没有扣除成功,b账户加上了10万元。
  • a账户中的10万元扣除成功,b账户没有加上10万元。

这种情况是绝对不允许的,"a账户扣除10万元"和"b账户加上10万元"这两个操作应给作为一个不可分割的整体操作才行。如果"a账户扣除10万元"的操作失败,那么"b账户加上10万元"的操作应该取消。

实际上,++将多个操作作为一个整体来处理++ ,像这样的功能我们称为**"事务"(transaction)** 。将事务开始之后的处理结果反映到数据库中的操作称为**"提交"(commit)** ,不反映到数据库而是回复成原来状态的操作称为**"回滚"(rollback)**。


2.使用事务

如果使用delete from product:这样的SQL语句会把整个表的数据都给删除,并且是无法恢复的。如果我们希望删除之后还能恢复,此时可以使用事务来实现。

2.1 开启事务

语法:

sql 复制代码
start transaction;

此时事务已经开启了。

开启事务后再去执行下面的操作。

sql 复制代码
-- 删除数据
delete from student;

--查看表
select *from student;

删除后,student表里面的数据都没有了。

由于前面开启了事务,所以现在我们有两个选择:commit或rollback。如果想要回复数据,我们可以使用rollback语句,然后再执行查看表的代码。

sql 复制代码
-- 回滚
rollback;
-- 查看表
select *from student;

执行后,删除的数据也回来了。

如果不执行rollback而是commi,那么删除操作的结果就会反映到数据库中,然后所有的数据都会被删除。

2.2 自动提交

默认情况下,也就是不手动开启事务,MySQL的处理都是直接被提交的。也就是说,所有的操作都会自动执行"commit"。

自动提交事务功能在默认情况下处于开启状态的,如果我们手动使用start transaction开启了事务,那么后面就不会自动提交,而必须由我们手动执行commit来提交。

当然也可以通过下面的语句将自动提交功能关闭。

sql 复制代码
set autocommit = 0;

关闭自动提交功能后,如果想要重新开启该功能,我们可以执行下面的代码来实现:

sql 复制代码
set autocommit = 1;

2.3 使用范围

MySQL启动了事务之后,大多数操作都可以通过回滚来进行还原。不过下面这些操作时无法还原的,这一点要记住。

  • drop database
  • drop table
  • drop view
  • alter table

2.4 事务的属性

在MySQL中,事务有严格的定义,必须同时满足四个属性才行:原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)。这四个属性通常又被称为"ACID"特性。

  • 原子性:事务作为一个整体来执行,所有操作要么都执行,要么都不执行。
  • 一致性:事务应确保数据库的状态,从一个一致状态转变为另一个一致状态。
  • 隔离性:当多个事务并发执行(多个事务同时执行)时,一个事务的执行不应该影响其他事务的执行。
  • 持久性:事务一旦提交,它对数据库的修改应该永久保存在数据库中。
相关推荐
Java爱好狂.6 分钟前
RDB&AOF持久化原理解析
java·数据库·redis·后端开发·java编程·java程序员·java八股文
蓝胖子Lcl7 分钟前
Mac安装Oracle数据库(M芯片)
数据库·macos·oracle
砚边数影14 分钟前
从文档型数据库到企业级数据平台:一次架构演进的思考与实践
数据库·mongodb·架构·kingbase·数据库平替用金仓·金仓数据库
SQL必知必会37 分钟前
SQL 删除重复行完全指南
数据库·sql
工业甲酰苯胺1 小时前
spring-事务管理
数据库·sql·spring
全栈前端老曹1 小时前
【Redis】Redis 持久化机制 RDB 与 AOF
前端·javascript·数据库·redis·缓存·node.js·全栈
李慕婉学姐1 小时前
Springboot平安超市商品管理系统6sytj3w6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Elastic 中国社区官方博客1 小时前
易捷问数(NewmindExAI)平台解决 ES 升级后 AI 助手与 Attack Discovery 不正常问题
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai
瀚高PG实验室2 小时前
数据库意外中止,无法启动
数据库·瀚高数据库
Amarantine、沐风倩✨2 小时前
列表接口严禁嵌套 LISTAGG + REGEXP:一次 mission_label 性能事故复盘
java·数据库·sql