MySQL 事务简介

news2024/11/22 23:25:14

事务简介

事务的起源

狗哥和猫爷是⼀对好基友,他们都到银⾏开⼀个账户,他们在现实世界中拥有的资产就会体现在数据库世界的account表中。⽐如现在狗哥有11元,猫爷只有2元,那么现实中的这个情况映射到数据库的account表就是这样:

+----+--------+---------+
|	id	|	name  	|	balance	|
+----+--------+---------+
| 	1	|	狗哥  	|     	11	|
| 	2	|	猫爷  	|      	2	|
+----+--------+---------+

⽐⽅说有⼀次猫爷在赌场赌博输了钱,急忙打电话给狗哥要借10块钱,不然那些看场⼦的就会把⾃⼰剁了。现实世界中的狗哥⾛向了ATM机,输⼊了猫爷的账号以及10元的转账⾦额,然后按下确认,狗哥就拔卡⾛⼈了。
但是这⾥头有个问题,银行把狗哥的钱扣了,忽然服务器断电了,并没有把扣得前给猫爷转过去,那猫爷还是逃脱不了被砍死的噩运~

原⼦性(Atomicity)

要么全做,要么全不做的规则称之为原⼦性。

隔离性(Isolation)

我们将狗哥向猫爷同时进⾏的两次转账操作分别称为T1和T2,在现实世界中T1和T2是应该没有关系的,可以先执⾏完T1,再执⾏T2,或者先执⾏完T2,再执⾏
T1,对应的数据库操作就像这样:
在这里插入图片描述
但是很不幸,真实的数据库中T1和T2的操作可能交替执⾏,⽐如这样:
在这里插入图片描述
如果按照上图中的执⾏顺序来进⾏两次转账的话,最终狗哥的账户⾥还剩6元钱,相当于只扣了5元钱,但是猫爷的账户⾥却成了12元钱,相当于多了10元钱

⼀致性(Consistency)

数据库中的数据全部符合现实世界中的约束(all defined rules),我们说这些数据就是⼀致的,或者说符合⼀致性的。
例如:银行中,个人的存款不是是负数、每次存款的变动时收入和支出的是一样的等等。

持久性(Durability)

如果当狗哥⾛掉之后,银⾏⼜把这次转账操作给撤销掉,恢复到没转账之前的样⼦,那猫爷不就惨了,⼜得被砍死了,所以这个持久性是⾮常重要的

事务的概念

原⼦性(Atomicity)、隔离性(Isolation)、⼀致性(Consistency)持久性(Durability)这四个词对应的英⽂单词⾸字⺟提取出来就是A、I、C、D,稍微变换⼀下顺序可以组成⼀个完整的英⽂单词:ACID
把需要保证原⼦性、隔离性、⼀致性和持久性的⼀个或多个数据库操作称之为⼀个
事务
(英⽂名是:transaction)。
事务的状态:

  • 活动的(active)
    事务对应的数据库操作正在执⾏过程中时,我们就说该事务处在活动的状态。
  • 部分提交的(partially committed)
    当事务中的最后⼀个操作执⾏完成,但由于操作都在内存中执⾏,所造成的影响并没有刷新到磁盘时,我们就说该事务处在部分提交的状态。
  • 失败的(failed)
    当事务处在活动的或者部分提交的状态时,可能遇到了某些错误(数据库⾃身的错误、操作系统错误或者直接断电等)⽽⽆法继续执⾏,或者⼈为的停⽌当前事务的执⾏,我们就说该事务处在失败的状态。
  • 中⽌的(aborted)
    如果事务执⾏了半截⽽变为失败的状态,⽐如我们前边唠叨的狗哥向猫爷转账的事务,当狗哥账户的钱被扣除,但是猫爷账户的钱没有增加时遇到了错误,从⽽当前事务处在了失败的状态,那么就需要把已经修改的狗哥账户余额调整为未转账之前的⾦额,换句话说,就是要撤销失败事务对当前数据库造成的影响。
    书⾯⼀点的话,我们把这个撤销的过程称之为回滚。当回滚操作执⾏完毕时,也就是数据库恢复到了执⾏事务之前的状态,我们就说该事务处在了中⽌的状态。
  • 提交的(committed)
    当⼀个处在部分提交的状态的事务将修改过的数据都同步到磁盘上之后,我们就可以说该事务处在了提交的状态。
    在这里插入图片描述

MySQL中事务的语法

开启事务

我们可以使⽤下边两种语句之⼀来开启⼀个事务:
BEGIN [WORK];
BEGIN语句代表开启⼀个事务,后边的单词WORK可有可⽆。开启事务后,就可以继续写若⼲条语句,这些语句都属于刚刚开启的这个事务。

mysql>	BEGIN;
Query	OK,	0	rows	affected	(0.00	sec)

mysql> 加⼊事务的语句…
START TRANSACTION;
START TRANSACTION语句和BEGIN语句有着相同的功效,都标志着开启⼀个事务,⽐如这样:

mysql>	START	TRANSACTION;
Query	OK,	0	rows	affected	(0.00	sec)

mysql> 加⼊事务的语句…
不过⽐BEGIN语句⽜逼⼀点⼉的是,可以在START TRANSACTION语句后边跟随⼏个修饰符,就是它们⼏个:

  • READ ONLY:标识当前事务是⼀个只读事务,也就是属于该事务的数据库操作只能读取数据,⽽不能修改数据。
  • READ WRITE:标识当前事务是⼀个读写事务,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。
  • WITH CONSISTENT SNAPSHOT:启动⼀致性读

提交事务

开启事务之后就可以继续写需要放到该事务中的语句了,当最后⼀条语句写完了之后,我们就可以提交该事务了,提交的语句也很简单:
COMMIT [WORK]

⼿动中⽌事务

如果我们写了⼏条语句之后发现上边的某条语句写错了,我们可以⼿动的使⽤下边这个语句来将数据库恢复到事务执⾏之前的样⼦:
ROLLBACK [WORK]

⽀持事务的存储引擎

MySQL中并不是所有存储引擎都⽀持事务的功能,⽬前只有InnoDB和NDB存储引擎⽀持。

⾃动提交

MySQL中有⼀个系统变量autocommit:

mysql>	SHOW	VARIABLES	LIKE	'autocommit';
+---------------+-------+
|	Variable_name	|	Value	|
+---------------+-------+
|	autocommit   	|	ON   	|
+---------------+-------+
1	row	inset	(0.01	sec)

可以看到它的默认值为ON,

隐式提交

当我们使⽤START TRANSACTION或者BEGIN语句开启了⼀个事务,或者把系统变量autocommit的值设置为OFF时,事务就不会进⾏⾃动提交,但是如果我们输⼊了某
些语句之后就会悄悄的提交掉,这种因为某些特殊的语句⽽导致事务提交的情况称为隐式提交。这些会导致事务隐式提交的语句包括:

  • 定义或修改数据库对象的数据定义语⾔(Data definition language,缩写为:DDL)
  • 隐式使⽤或修改mysql数据库中的表
  • 事务控制或关于锁定的语句
    • 当我们在⼀个事务还没提交或者回滚时就⼜使⽤START TRANSACTION或者BEGIN语句开启了另⼀个事务时,会隐式的提交上⼀个事务
    • 或者当前的autocommit系统变量的值为OFF,我们⼿动把它调为ON时,也会隐式的提交前边语句所属的事务
    • 或者使⽤LOCK TABLES、UNLOCK TABLES等关于锁定的语句也会隐式的提交前边语句所属的事务。
  • 加载数据的语句
  • 关于MySQL复制的⼀些语句
  • 其它的⼀些语句
    使⽤ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、 LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE、RESET等语句也会隐式的提交前边语句所属的事务。

保存点

如果你开启了⼀个事务,并且已经敲了很多语句,忽然发现上⼀条语句有点问题,你只好使⽤ROLLBACK语句来让数据库状态恢复到事务执⾏之前的样⼦,然后⼀切从头再来,总有⼀种⼀夜回到解放前的感觉。所以设计数据库的⼤叔们提出了⼀个保存点(英⽂:savepoint)的概念。

  • 定义保存点的语法如下:
    SAVEPOINT 保存点名称;
  • 当我们想回滚到某个保存点时,可以使⽤下边这个语句(下边语句中的单词WORK和SAVEPOINT是可有可⽆的):
    ROLLBACK [WORK] TO [SAVEPOINT] 保存点名称;
    不过如果ROLLBACK语句后边不跟随保存点名称的话,会直接回滚到事务执⾏之前的状态。
  • 如果我们想删除某个保存点,可以使⽤这个语句:
    RELEASE SAVEPOINT 保存点名称;

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

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

相关文章

机器学习常识 11: logistic 回归

摘要: logistic 回归是使用超平面将空间分开, 一边是正样本, 另一边是负样本. 因此, 它是一个线性分类器. 1. 线性分类器 如图 1 所示, 若干样本由两个特征描述, 对应于二维平面上的点. 它们为正样本或负样本, 由不同颜色表示. 现在需要使用一条直线将正、负样本分开. 这样, …

比ureport好用的报表工具-VeryReport报表工具

作为一名报表开发人员,你一定知道,一个好用的报表工具是多么重要。它可以让你更快、更准确地完成报表开发任务,并且帮助你更好地展现数据。今天我想向大家介绍一款非常优秀的报表工具——VeryReport报表工具。 编辑搜图 请点击输入图片描述&…

STM32 启动文件选择

1. STM32F1xx 系列 (F1) STM32F100xB/C: startup_stm32f100xb.s STM32F100xD/E: startup_stm32f100xe.s STM32F101x6/8/B: startup_stm32f101x6.s, startup_stm32f101x8.s, startup_stm32f101xb.s STM32F101xE/F/G: startup_stm32f101xe.s, …

线程安全与互斥锁(访问控制)

线程安全问题 因为多个线程是共享地址空间的,也就是很多资源都是共享的。 优点:通信方便缺点:缺乏访问控制 因为一个线程的操作问题,给其他线程造成了不可控,或者引起崩溃,异常,逻辑不正确等这种现象:线程安全。 创…

基于Java实现农产品交易平台的设计与实现_kaic

【摘要】农业是我国国民经济的重要组成部分,随着信息化的普及,4G网络、光纤以及5G网络也日益完善,农业信息化的发展成为了必然。同时,由于本年疫情原因,导致农作物积压销售,甚至腐烂造成不必要的浪费&#…

chatgpt赋能python:Python信息抽取——帮您更好地利用数据

Python信息抽取——帮您更好地利用数据 什么是Python信息抽取? Python信息抽取是指利用Python编写程序,从大量的非结构化数据中提取有用的信息的技术。这些数据可以是网页、文本文件、PDF等各种格式,而Python信息抽取则可以帮助您快速、准确…

分享一个case when then when then end的sql语句编写用法

目录 写作背景我和若依的前一部分相同思路我的后续解决思路(不建议)若依后续解决思路(建议)若依后续解决思路举例 写作背景 平时我用case when then else end的机会也不多,之前用它来做对select结果进行计算&#xff…

chatgpt赋能python:Python代码20行,助力千万SEO从业者快速实现网站分析

Python代码20行,助力千万SEO从业者快速实现网站分析 SEO是现代数字营销的核心战略之一。对于千万从业者而言,网站分析是SEO实践的重要一环。而Python作为一门高效、简洁的编程语言,其丰富的第三方库和易学易用的语法使其成为网站分析的强大工…

【MySQL】从0到1打开数据库管理

目录 前言: 一.认识MySQL 二.安装MySQL数据库 三、启动和停止MySQL服务 3.1启动服务的两种方式 3.2停止服务的两种方式 四.链接客户端 4.1使用自带的命令行窗口 4.2使用系统自带的命令窗口 五.MySQL是存储数据的模型 六.SQL语言 结尾: 前言&a…

设计二:51单片机外部中断控制

目录 一、设计内容 二、中断相关知识 1、51单片机中断源 2、中断系统特殊功能寄存器 3、中断函数与函数调用区别 三、仿真原理图 四、程序设计 五、仿真结果 六、思考题 作者有话说 一、设计内容 本次设计使用2个按键,在无按键按下时,最下面一…

chatgpt赋能python:Python代码50行:如何使用Python进行SEO分析

Python代码50行:如何使用Python进行SEO分析 随着互联网的发展,Search Engine Optimization(SEO)已经成为企业网络营销策略中至关重要的一环。而Python作为一种全能的编程语言,已经逐渐成为许多SEO工程师的首选工具。本…

chatgpt赋能python:Python修改List的教程

Python修改List的教程 当涉及到Python编程时,对于处理和管理数据,List是一个非常常见和有用的数据结构。像大多数数据结构一样,有时需要对List进行修改,以便更好地满足程序的需求。因此,本文将向您展示如何使用Python…

数据结构与算法09:二叉树

目录 【树】 【二叉树】 二叉树的遍历 Go代码实现 二叉树的复杂度分析 【二叉搜索树】 Go代码实现 【每日一练:移除元素】 【树】 什么是树?这个不用解释了吧,马路两边种的都是树。数据结构里面的“树”和现实生活中的树类似&#…

chatgpt赋能python:Python会动的图形:如何让你的网站活力四射

Python会动的图形:如何让你的网站活力四射 如果你想让你的网站更具生命力、吸引力和互动性,一种非常有效的方式是使用动态图形。而Python有许多强大的库可以帮助你实现这一目标。在本篇文章中,我们将讨论Python会动的图形的好处、如何实现和…

过滤器JavaWeb:Filter与拦截器Spring:Intercepter

过滤器与拦截器若同时存在,先执行过滤器的放行前,再执行整个拦截器,最后再执行过滤器的放行后 过滤器会拦截所有资源(包括静态资源),拦截器只会拦截Spring环境的资源 Filter的使用 1、创建一个类implement…

深蓝学院C++基础笔记 第 1 章 C++初探

第 1 章 C初探 1&#xff0e;从Hello World 谈起 Hello World: #include <iostream> int mian() { std::cout << "Hello World!" << std::endl; }函数: 一段能被反复调用的代码&#xff0c;可以接收输入&#xff0c;进行处理并(或)产生输出-返回…

Postgres vs MySQL

主要区别及示例 简而言之&#xff0c;Postgres 和 MySQL 之间的主要区别实际上归结为主索引和辅助索引的实现方式以及数据的存储和更新方式。 让我们进一步探讨这个问题。 但首先... 基础知识 索引是一种数据结构&#xff08;主要是 B 树&#xff09;&#xff0c;允许通过…

DAY01_MySQL基础数据类型navicat使用DDL\DML\DQL语句练习

目录 1 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL 2 MySQL2.1 MySQL安装2.1.1 安装步骤 2.2 MySQL配置2.2.1 添加环境变量2.2.2 MySQL登录2.2.3 退出MySQL 2.3 MySQL数据模型2.4 MySQL目录结构2.5 MySQL一些命令2.5.1 修改默认账户密码2.5.2…

Linux 计划任务(at与crontab)

一次性计划任务 at Linux 中的【 at 】 命令是用来创建一次性计划任务的&#xff0c; at 命令有一个服务 atd 以后台的模式运行&#xff0c;通过检查当前的时间来决定是 否运行 " 计划 " &#xff0c;默认情况下&#xff0c; atd 服务每 60 秒检 查一次&#x…

【Web服务应用】Nginx服务

Nginx服务 一、Nginx概述1.1Nginx特点1.2Nginx作用1.3Nginx与Apache的差异 二、Nginx进程模型三、编译安装Nginx3.1Nginx服务的检查、启动、停止&#xff0c;重载3.2平滑升级3.3把nginx进程加入到系统服务当中 四、Nginx服务的主配置文件nginx.conf4.1补充什么是IO多路复用4.2根…