[MySQL]事务的理论、属性与常见操作

目录

一、事物的理论

1.什么是事务 

2.事务的属性(ACID)

3.再谈事务的本质

4.为什么要有事务

二、事务的操作

1.事务的支持版本

2.事务的提交模式

介绍

自动提交模式

手动提交模式

3.事务的操作

4.事务的操作演示

验证事务的回滚

事务异常的自动回滚 


一、事物的理论

        场景:一个火车售票系统,从甲地到乙地的票总共有100张,卖到最后的时候,客户端A查看到还有一张票,讲票买了回来,但是还没有执行数据库更新操作的时候,客户端B读取了数据库中票的个数数据,发现也还有一张票,那么就也卖走了,那么客户端A和客户端B买的其实是同一张票,那么就会出问题了。

        场景:在转账的时候,客户端A转了1000元之后,成功扣款了,并更新了客户端A的余额数目,但是没等到客户端B的数据库表更新余额增加1000元,服务器出了一点点小问题,那么就没有执行增加1000元的操作,但是客户端A却少1000元,这样就也是非常不合理的。 

        我们允许特殊情况的发生,但是在特殊情况发生的时候,应该有一套完整的解决方案来解决问题,尤其是数据库在实际开发中都是处于高并发访问的环境下,那么上述的场景就更应该保证不会出问题了。

1.什么是事务 

        事务的本质就是一组DML语句构成的。这些语句在业务逻辑上存在一定的相关性。例如上述的转账操作,有修改A的数据库表,修改B的数据库表等操作,这些操作存在一定的相关性共同构成了一个业务逻辑,这些SQL语句组合起来称为一个事务。所以对于事务,不应该站在MySQL角度,应该站在使用者的角度去看待,使用者想要完成一个业务操作,对应需要使用的一条或者多条SQL语句就是构成了一个事务。

        对于事务的执行操作,如果执行要么就是全部成功,要么就全部失败,事务中的多条DML语句是一个整体。MySQL提高一种机制,保证我们可以达到这种效果。这样的话,上述转账转到一半失败的场景,那么就会将A的值减少1000的操作也视为失败,就不会在操作数据库减少了。

2.事务的属性(ACID)

        在实际应用场景中,同一时间会有大量的业务包装成事务,向MySQL服务器发送事务的请求处理,而每个事务又包含了一个或多个SQL语句,那么这些大量的SQL语句如果访问的是同一张表的话,不加保护就一定会出问题,和多线程的线程安全问题类似。还有就是我们在执行事务的时候,执行到一般不想执行了,该怎么办,对于已经执行过的操作该如何处理呢?

  • 原子性:一个事务中的所有操作,要么全部完成,要么全部不执行,不会结束在中间的某个患者,事务在执行过程中出错,或者不想继续执行的时候,会被回滚到事务开始前的一个状态,所以说之前执行完的操作就会失效了。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的数据必须完全复合所有的预设规则。
  • 隔离性:数据库允许多个并发的事务同时对数据进行读写和修改的操作,隔离性可以防止多个事务在并发执行的时候,由于交叉执行而导致的数据不一致,事务的隔离又分为了多个级别,分为未提交、都提交、可重复读和串行化。
  • 持久性:事务处理结束之后,对数据的修改是永久性的,即使系统故障也不会丢失,因为已经持久化存放到磁盘当中了。

        对于原子性和持久性比较好理解,那么一致性是什么意思呢?就是事务在执行操作之前,就可以预期到执行的操作以及执行后的结果了,并且执行的时候完全按照预期的操作执行。这样可以预期的操作,就大大降低了出现问题的概率。对于一致性,MySQL是没有做任务的操作和约束策略的,而是通过原子性、持久性和隔离性去实现了事务的一致性,也就是说满足了事务的其他三个属性也就满足了事务的一致性。所以说一致性单纯靠MySQL是无法实现了,还需要用户的配合。

3.再谈事务的本质

        事务的本质就是:在ACID属性的加持下的一条或多条DML语句的集合。从底层来看的话,数据库的使用者会使用特殊SQL语句指明事务的开始,在MySQL内部其实就相当于是创建了一个事务对象,使用者在事务内部输入的SQL语句,都会放到事务对象的内部,然后事务对象会放到数据库的事务运行队列当中。这样就把统一时间的大量事务进行了管理。

4.为什么要有事务

        事务被设计出来是为了应用层服务的,而不是数据库天然就有的,当我们在执行一些业务操作的时候,只有两种情况,我们不需要考虑中间某一部出错该如何处理,要么就都执行,要么就都不执行,方便了程序员的操作。数据库本身设计出来就是为了方便程序员对于数据的管理的,如果让并发访问的安全问题以及操作的错误问题交给程序员来判断和解决的话,那么数据库设计出来的意义就大大降低了,会提高程序员的编程难度。

二、事务的操作

1.事务的支持版本

show engines;

        市面上有很多数据库都支持事务的操作,MySQL也是其中之一,但是是否支持事务是按照存储引擎来划分的,例如Innodb存储引擎就支持事务,而MyISAM存储引擎就不支持事务的操作,可以使用show engines查看数据库支持的存储引擎,其中的Transactions字段就表示是否支持事务。

2.事务的提交模式

介绍

show variables like 'autocommit'             //查看数据库的事务提交方式

set autocommit = 1/0;                              //设置数据库的事务提交方式,1为自动提交

        事务提交分为手动提交和自动提交,可以使用show variables like 'autocommit'进行查看属性字段,如果是ON的话就代表的是自动提交。

        提交模式主要是控制事务的提交行为,他决定了数据库操作是立即提交还是在显示的输入提交语句命令之后再去提交,这里的提交也就是将SQL语句修改的数据库内容,持久化的写入到内存当中,再提交之前都是在数据库内存缓冲区当中进行操作的。

自动提交模式

        在自动提交模式下,每一条SQL语句都会被数据库认为是一个单独的事务,并且在语句执行完成后自动提交,不用我们显示的去输入提交命令了。但是这种只适用于简单的SQL语句,一旦涉及到一些复杂的业务逻辑的话,一条SQL语句作为的事务是无法去完成完整的业务的。

手动提交模式

        在该模式下,需要显示的使用BEGIN或者START TRANSACTION开启一个事务,并进行操作各种SQL操作,但是这些操作都是在内存中的,最后需要手动的使用commit语句才可以完成事务的提交。如果我们设置的是自动提交的话,在我们开启事务的时候,不会受影响,都需要我们手动进行提交操作。

3.事务的操作

启动事务

语句:start transaction; / begin;

        对于功能上的区别不大,都是用来开启一个事务的,但是begin属于SQL标准中的一个关键字,用于开启一个事务,他在大多数支持书屋的数据库系统中都可以使用,有很好的兼容性。而前者则属于是MySQL独有的语法,但是他可以在开启事务的同时,为事务设置一些特性内容,提高了更灵活的事务控制。 

 创建保存点

语句:savepoint xxxx;

回滚操作

语句:rollback [xx];     

        可以设置回滚到哪一个保存点,如果不设置的话,会回滚到最初。但是前提是该事务没有被提交,如果提交了之后就无法进行事务的回滚操作了。 

提交操作

语句:commit;

        事务的操作是原子性的,而commit操作就是证明该操作完整的执行了,那么所有对数据库的操作内容才会被永久的存放到磁盘当中。在没有提交之前所有的操作都是在MySQL的内存缓冲区当中进行的。

        如果说在事务执行到一半的时候,不管什么原因,客户端退出了,没有执行提交操作,基于事务的原子性,那么MySQL会自动回滚到事务的最开始,也就相当于该事务什么都没有操作。可以使用ctrl + \模拟异常终止MySQL数据库。

4.事务的操作演示

前提操作:

//创建数据库表
mysql> create table account (-> id int primary key,-> name varchar(20) default '',-> blance decimal(10, 2) default 0.0-> )engine=innodb charset=utf8;
Query OK, 0 rows affected, 1 warning (0.05 sec)//设置隔离级别为读未提交--以后解释
mysql> set global transaction isolation level READ UNCOMMITtED;
Query OK, 0 rows affected (0.00 sec)//查看是否设置成功
mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)//重启系统
mysql> quit;
验证事务的回滚
//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//设置保存点1
mysql> savepoint save1;
Query OK, 0 rows affected (0.00 sec)//插入数据1
mysql> insert into account values(1, '张三', 100);
Query OK, 1 row affected (0.00 sec)//设置保存点2
mysql> savepoint save2;
Query OK, 0 rows affected (0.00 sec)//插入数据2
mysql> insert into account values(2, '李四', 200);
Query OK, 1 row affected (0.00 sec)//查看此时的表内容
mysql> select * from account;
+----+--------+--------+
| id | name   | blance |
+----+--------+--------+
|  1 | 张三   | 100.00 |
|  2 | 李四   | 200.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//回滚到保存点2
mysql> rollback to save2;
Query OK, 0 rows affected (0.02 sec)//查看数据,发现在保存点2后插入的数据在表中查看不到了
mysql> select * from account;
+----+--------+--------+
| id | name   | blance |
+----+--------+--------+
|  1 | 张三   | 100.00 |
+----+--------+--------+
1 row in set (0.00 sec)//回滚到事务的最开始
mysql> rollback;
Query OK, 0 rows affected (0.01 sec)//查看数据发现表中的所有数据都不见了
mysql> select * from account;
Empty set (0.00 sec)
事务异常的自动回滚 
//客户端A-------------------------------------------------------------
//开启事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)//插入两条数据
mysql> insert into account values (1, '张山', 100);
Query OK, 1 row affected (0.00 sec)mysql> insert into account values (2, '李四', 100);
Query OK, 1 row affected (0.00 sec)//异常终止客户端A
mysql> Aborted//客户端B-------------------------------------------------------------
//客户端A终止前查看表
mysql> select * from account;
+----+--------+--------+
| id | name   | blance |
+----+--------+--------+
|  1 | 张山   | 100.00 |
|  2 | 李四   | 100.00 |
+----+--------+--------+
2 rows in set (0.00 sec)//终止后查看表
mysql> select * from account;
Empty set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后盾人JS--闭包明明白白

延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时&#xff0c;都会出现在一个对话框里面存在好多的选项&#xff0c;导致对话框变得非常长或者非常大&#xff0c;就会显现的不美观&#xff0c;在这种情况下通常是添加一个页面的滚动条来解决这个问题&#xff0c;下面我们就来介绍给MFC的对话…

(undone) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1&#xff1a;Implement copy-on-write fork(hard) (doing) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过…

分享| RL-GPT 框架通过慢agent和快agent结合提高AI解决复杂任务的能力-Arxiv

结论 “RL-GPT: Integrating Reinforcement Learning and Code-as-policy” RL-GPT 框架为解决大语言模型在复杂任务处理中的难题提供了创新有效的途径&#xff0c; 旨在将强化学习&#xff08;RL&#xff09;和代码即策略相结合&#xff0c; 以解决大语言模型&#xff08…

PPT自动化 python-pptx -7: 占位符(placeholder)

占位符&#xff08;placeholder&#xff09;是演示文稿中用于容纳内容的预格式化容器。它们通过让模板设计者定义格式选项&#xff0c;简化了创建视觉一致幻灯片的过程&#xff0c;同时让最终用户专注于添加内容。这加快了演示文稿的开发速度&#xff0c;并确保幻灯片之间的外观…

【Linux权限】—— 于虚拟殿堂,轻拨密钥启华章

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

【算法应用】基于A*-蚁群算法求解无人机城市多任务点配送路径问题

目录 1.A星算法原理2.蚁群算法原理3.结果展示4.代码获取 1.A星算法原理 A*算法是一种基于图搜索的智能启发式算法&#xff0c;它具有高稳定性和高节点搜索效率。主要原理为&#xff1a;以起点作为初始节点&#xff0c;将其加入开放列表。从开放列表中选择具有最小总代价值 f (…

自制一个入门STM32 四足机器人具体开发顺序

0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识&#xff0c;包括 GPIO、定时器、串口通信等外设的使用&#xff0c;可通过官方文档、教程和视频课程进行学习。了解舵机控制原理&#xff0c;因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…

洛谷P11464 支配剧场

支配剧场 题目背景 May all the beauty be blessed. 题目描述 布洛妮娅和符华在寻找琪亚娜的途中&#xff0c;被支配之律者困在了支配剧场的高塔回廊之中。布洛妮娅敏锐地发现&#xff0c;虚无回廊是由一些支配之律者生成的积木构成的&#xff0c;只要击碎其中一些积木&#…

http3网站的设置(AI不会配,得人工配)

堡塔PHP项目中配置nginx1.26.0设置http3协议 # 文件所在服务器中的路径 /www/server/nginx/conf/nginx.confuser www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log crit; pid /www/server/nginx/logs/nginx.pid; worker_rlimit_nofile 512…

Python-基于PyQt5,json和playsound的通用闹钟

前言&#xff1a;刚刚结束2024年秋季学期的学习&#xff0c;接下来我们继续来学习PyQt5。由于之前我们已经学习了PyQt5以及PyUIC,Pyrcc和QtDesigner的安装&#xff0c;配置。所以接下来我们一起深入PyQt5&#xff0c;学习如何利用PyQt5进行实际开发-基于PyQt5&#xff0c;json和…

预测不规则离散运动的下一个结构

有一个点在19*19的平面上运动&#xff0c;运动轨迹为 一共移动了90步&#xff0c;顺序为 y x y x y x 0 17 16 30 10 8 60 15 15 1 3 6 31 10 7 61 14 15 2 12 17 32 9 9 62 16 15 3 4 12 33 10 9 63 18 15 4 3 18 34 15 12 6…

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…

供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇

综述 我们之前在供应链系统设计-中台系统设计系列&#xff08;五&#xff09;- 供应链中台实践概述文章中针对中台到底是什么进行了描述&#xff0c;对于中台的范围也进行划分&#xff0c;如下图所示&#xff1a; 关于商品中心&#xff0c;我们之前用4篇文章介绍了什么是商品中…

C27.【C++ Cont】时间、空间限制和STL库的简单了解

&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;春节篇&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8; 目录 1.竞赛中的…

步进电机加减速公式推导

运动控制梯形速度曲线相关算法请参考下面系列文章 PLC运动控制基础系列之梯形速度曲线_三菱运动控制模块梯形加减速-CSDN博客文章浏览阅读3.1k次,点赞3次,收藏7次。本文是关于PLC运动控制的基础教程,重点介绍了梯形速度曲线的概念、计算和应用。讨论了梯形加减速在启动和停…

指针的介绍3后

1.函数指针变量 1.1函数的地址 void test(int (*arr)[2]) {printf("zl_dfq\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; } 由上面的程序运行可知&#xff1a; 函数名就是函数的地址 &函数名也可以拿到函…

春晚舞台上的人形机器人:科技与文化的奇妙融合

文章目录 人形机器人Unitree H1的“硬核”实力传统文化与现代科技的创新融合网友热议与文化共鸣未来展望&#xff1a;科技与文化的更多可能结语 2025 年央视春晚的舞台&#xff0c;无疑是全球华人目光聚焦的焦点。就在这个盛大的舞台上&#xff0c;一场名为《秧BOT》的创意融合…