首页 > 数据库 >初始MYSQL数据库(6)—— 事务

初始MYSQL数据库(6)—— 事务

时间:2024-09-23 13:51:49浏览次数:11  
标签:事务 student -- 数据库 回滚 提交 MYSQL 初始 隔离

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: MYSQL

目录

事务的概念 

事务的ACID特性

使用事务

查看支持事务的存储引擎 

事务的语法 

保存点 

自动/手动提交事务

事务的隔离性和隔离级别


事务的概念 

首先,得了解什么是事务? 事务将一组SQL语句打包成一个整体,在这组SQL语句的执行过程中,要么全部成功,要么全部失败,以保证数据的一致性。

事务的ACID特性

事务的ACID特性指的是 Atomicity (原子性), Consistency (一致性), Isolation (隔离性)和 Durability (持久性)。 

Atomicity(原子性):一个事务中的所有操作,要么全部成功,要么全部失败,不会出现只执
行了一半的情况,如果事务在执行过程中发生错误,会回滚(Rollback)到事务开始前的状
态,就像这个事务从来没有执行过一样;
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性不会被破坏。这表
示写入的数据必须完全符合所有的预设规则,包括数据的精度、关联性以及关于事务执行过程中服
务器崩溃后如何恢复。简单理解就是事务开始前后的数据量要一致;
Isolation(隔离性):数据库允许多个并发事务同时对数据进行读写和修改,隔离性可以防止多
个事务并发执行时由于交叉执行而导致数据的不一致。事务可以指定不同的隔离级别,以权衡在不
同的应用场景下数据库性能和安全;
Durabi礼ity(持久性):事务处理结束后,对数据的修改将永久的写入存储介质,即便系统故障
也不会丢失。

正因为事务具备上述四个特性,保证了在使用事务过程中,要么提交,要么回滚,不用去考虑网络异常,服务器宕机等其他因素,因此事务在数据库的使用是非常频繁的。

既然事务这么好用,那么我们该怎么去使用事务呢? 

使用事务

查看支持事务的存储引擎 

在使用事务之前,得查看我们本机的数据库是否支持事务。

在MySQL中支持事务的存储引擎是InnoDB,可以通过 show engines; 语句查看:

知道了本机中的数据库是支持事务之后,便可以开始进行事务了。

事务的语法 

-- 开始一个新的事务
start transaction;
-- 或者下面这种写法
begin;

-- 提交当前事务,并对SQL语句的执行而影响的数据进行持久化保存
commit;

-- 回滚当前事务,并取消SQL语句的执行而影响的数据
rollback;

注意:无论是commit 还是 rollback 都会把事务关闭。

下面就来进行实操:

-- 开启事务
start transaction;

-- 插入一条数据
insert into student values (NULL, '小红', 18, 0);

-- 在事务中查看student表中的结果集
select * from student;

-- 回滚事务
rollback;

-- 在回滚之后,再查看student表中的结果集
select * from student; 

从上面的结果,我们就可以看出回滚之后,事务中的SQL语句全部失效。现在我们再来观察commit 的效果。 

-- 开启事务
start transaction;

-- 插入一条数据
insert into student values (NULL, '小红', 18, 0);

-- 在事务中查看student表中的结果集
select * from student;

-- 提交事务
commit;

-- 在提交之后,再查看student表中的结果集
select * from student; 

从上面的结果,我们可以看出提交事务之后,事务中的SQL语句便生效了。 

保存点 

在事务执行的过程中设置保存点,回滚时指定保存点可以把数据恢复到保存点的状态。当事务中有多个修改数据的SQL语句时(包括插入、删除、更新),便可以设置多个保存点,以保证数据的一致性和操作方便。

语法:

savepoint savepoint_name; 

示例:

-- 开启事务
start transaction;

-- 修改多条数据

savepoint sp1; -- 设置第一个保存点
delete from student where id = 8 or id = 9;
select * from student;

savepoint sp2; -- 设置第二个保存点
insert into student values (NULL, '小丽', 19, 0);
select * from student;

savepoint sp3; -- 设置第三个保存点
update student set age = 20 where name = '张三';
select * from student;

-- 可以通过回滚到某一个保存点来取消修改
rollback to sp3; 
select * from student;

-- 如果rollback后面啥也不跟,那就是默认回滚到事务开始之前,并关闭事务
rollback;
select * from student;

自动/手动提交事务

默认情况下,MySQL是自动提交事务的,也就是说我们执行的每个修改操作,比如插入、更新和删除,都会自动开启一个事务并在语句执行完成之后自动提交,发生异常时自动回滚。即每一条SQL语句对应着一个事务。

查看当前事务是否自动提交可以使用以下语句:

show variables like 'autocommit';

如果value对应的是off,就是关闭的意思。

可以通过以下语句设置事务为自动或手动提交:

-- 设置事务为自动提交
set autocommit = 1; -- 方式一
set autocommit = on; -- 方式二

-- 设置事务为手动提交
set autocommit = 0; -- 方式一
set autocommit = off; -- 方式二

其实就是把自动提交开启或者关闭即可。

使用事务的时候,要注意一下三点:

1、只要使用start transaction 或 begin 开启事务,必须要通过commit 提交才会持久化,与是否设置set commit 无关。因为我们手动开启事务之后,必须要自己手动关闭事务。

2、手动提交模式下,不用显示开启事务,执行修改操作后,提交或回滚事务时直接使用commit
或rollback。因为手动提交下,就是需要我们自己把事务手动提交。

3、已提交的事务是不能够回滚的。

事务的隔离性和隔离级别

隔离性的概念: 

MySQL服务可以同时被多个客户端访问,每个客户端执行的SQL语句是以事务为基本单位,那么不同的客户端在对同一张表中的同一条数据进行修改的时候就可能出现相互影响的情况,为了保证不同的事务之间在执行的过程中不受影响,那么事务之间就需要要相互隔离,这种特性就是隔离性。这就类似于我们在食堂里面打饭的场景,同一个窗口,同一份饭菜,肯定有先来后到,不可能出现两个人同时拿到这份饭菜(假设不存在多个阿姨打饭的情况)。这就隔离开了。

隔离级别分类:

事务具有隔离性,那么如何实现事务之间的隔离?隔离到什么程度?如何保证数据安全的同时也
要兼顾性能?这都是要思考的问题。

事务间不同程度的隔离,称为事务的隔离级别;不同的隔离级别在性能和安全方面做了取舍,有
的隔离级别注重并发性,有的注重安全性,有的则是并发和安全适中;在MySQL的InnoDB引擎中事务的隔离级别有四种,分别是:
READ UNCOMMITTED,读未提交 —— 性能最强,但安全性最差。
READCOMMITTED,读已提交 —— 性能稍逊于读未提交,安全性比读未提交高。
REPEATABLE READ,可重复读(InnoDB默认) —— 性能比读已提交差,安全性比读已提交高。
SERIALIZABLE,串行化  —— 性能最差,但安全性最高。

下面就来解释上面四种隔离级别:

READ UNCOMMITED —— 在读取数据时,可以读取到用户正在编辑的数据。这些数据处于事务中,但是还未提交。虽然性能高,但会造成一种现象'脏读'——读取的数据不一定是真实的,可以用户后面会进行修改,再提交。

READ COMMITED —— 和上面的一对比,我们就知道这个是只能读取已经提交的数据。但这还会造成一种现象‘不可重复读’——可能现在这个时刻读取的数据内容是这样的,但是在另外一个时刻读取的数据内容确实另外的。

REPEATABLE READ —— 在出现不可重复读的基础上,进行了改进。既然这些数据在被读取时,可能刷新一下就变样了,那直接把这些数据加上枷锁,那么用户就不能进行修改了。但还会出现另外一个问题,此时用户往这个表中插入了数据,即结果集的条数发生了变化。这种现象叫做‘幻读’。

SERIALIZABLE —— 这个就是和我们学过的队列一样,数据是一次一次的读取。致使其不会出现安全问题,但是效率相比之下就慢很多。

好啦!本期 初始MYSQL数据库(5)—— 事务 的学习之旅就到此结束啦!我们下一期再一起学习吧!

标签:事务,student,--,数据库,回滚,提交,MYSQL,初始,隔离
From: https://blog.csdn.net/2301_80854132/article/details/142425139

相关文章

  • Oracle数据库高级技术解析与实战案例
    Oracle数据库高级技术解析与实战案例引言Oracle数据库作为企业级数据库市场的领导者,凭借其强大的数据处理能力、高可用性、可扩展性以及安全性,在各行各业得到了广泛应用。本文将深入探讨Oracle数据库的高级技术特性,并通过实际代码案例展示其在复杂业务场景中的应用。无论......
  • MYSQL--SQL语言
    SQL--操作关系型数据库语言在cmd中输入netstop/startmysql80来启用/关闭MySQL.在cmd中输入mysql-h127.0.0.1-P3306-uroot-p来连接到MySQL客户端,或者直接打开MySQL的客户端终端.关系型数据库使用表结构储存数据,使用统一的sql语言.SQL的通用语法1.sql语句可以多......
  • 医院急诊系统设计与实现spring boot+vue+mysql+html
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、其他案例七、源码获取​​​​​​​作者介绍:✌️大厂全栈码农|毕设实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️作者博客:曾几何时​​​​​​​......
  • 开源MySQL 数据库闪回工具:MyFlash数据恢复工具的安装及使用示例
    MyFlash是一个由美团点评开源的MySQL数据库闪回工具,它专门用于回滚MySQL中的DML操作,如INSERT、UPDATE和DELETE。这个工具通过解析MySQL的binlog文件来实现数据的恢复。使用MyFlash前,需要确保MySQL的binlog格式设置为ROW,并且binlog_row_image设置为FULL。以......
  • MySQL binlog解析工具binlog2sql使用示例
    binlog2sql是一个用于解析MySQL的二进制日志(Binlog)的工具,它可以将Binlog事件转换为SQL语句,这对于审计、数据同步等场景非常有用。binlog2sql通常用于实现MySQL数据的实时同步到其他数据库或系统中。安装binlog2sql首先,你需要安装binlog2sql。如果你使用的是Python环......
  • myflash MySQL数据恢复工具的使用示例:误删除数据恢复和误修改数据恢复两种场景
    以下是myflash数据恢复工具的使用示例,分为误删除数据恢复和误修改数据恢复两种情况:误删除数据恢复:构建测试环境:创建测试数据库和表。假设你已经安装并启动了MySQL服务,登录到MySQL客户端,执行以下语句创建一个名为testdb的数据库和一个名为user的表:sqlCREATEDATABASEtest......
  • MySQL binlog --skip-gtids --include-gtids --exclude-gtids 参数作用及使用示例
    在MySQL中,--skip-gtids选项用于完全跳过全局事务标识符(GTID)的处理,而--include-gtids和--exclude-gtids则是用于选择性地应用或跳过特定的GTID范围内的事务。这些选项通常在MySQL的二进制日志(binlog)消费者工具(如mysqlbinlog)中使用,而不是直接应用于MySQL服务器本身......
  • 阿里云数据库连接数据库错误:如何解决?
    当遇到阿里云数据库连接错误时,可以遵循以下步骤来排查和解决问题:检查网络连接:确认本地网络连接正常,没有中断或延迟。检查阿里云数据库实例的网络配置,确保实例的网络设置正确。检查防火墙设置,确保允许数据库连接的流量通过。检查数据库账号和密码:确认数据库连接时使用......
  • 无法打开登录所请求的数据库,登录失败
    当遇到“无法打开登录所请求的数据库,登录失败”的错误时,这意味着SQLServer无法使用提供的凭据打开指定的数据库。这个问题可能由多种原因引起,下面是一些常见的原因及其解决方法:原因数据库不存在:提供的数据库名称不存在或拼写错误。数据库不可用:数据库可能处于脱机状......
  • wordpress网站维护教程:不能上传文件,数据库报错的解决方法
    当WordPress网站遇到不能上传文件或数据库报错的问题时,这可能会影响网站的正常使用。下面分别针对这两种情况提供一些可能的解决方法。不能上传文件权限问题:检查上传文件的目标目录权限是否正确。通常,WordPress的上传目录(默认为/wp-content/uploads/)应该具有可写的权限。你......