Mysql进阶(事务)

一、数据库事务

数据库事务是访问并可能操作数据项的一个数据库操作序列,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作完成·。

通俗的来讲,就是一次对数据库操作过程,这个过程由多条sql执行,这么多条sql在一次执行过程中要么都成功执行么都不执行,保证数据完整性。mysql中只有innodb引擎支持事务。

二、事务的特性

原子性(Atomicity ,或称不可分割性)、一致性(Consistency)、隔离性(Isolation ,又称独立性)、持久性(Durability)。

1.原子性:

一个事务中的多条sql要么都成功执行,要么都不执行,回滚到事务执行前的状态。

2.隔离性:

数据库事务是可以有多个同时执行的(类似线程),需要对多个事务进行隔离。

3.持久性:

事务正常提交后可以保证数据持久保存,即使宕机。

4.一致性:

前面的原子性,隔离性,持久性都是为了保证一致性。保证数据是完整可靠的。例如转账,保证操作后的结果与我们预期的一致。

三、事务设置

默认情况下、Mysql启用自动提交模式(变量autocommit为ON)。这意味着,只要你执行DML操作的语句,Mysql会立即隐式提交事务。

由于变量autocommit分会话系统变量和全局系统变量,所以查询的时候,最好区别是会话系统变量还是全局系统变量。

Mysql事务处理的两种办法:

1.用BEGIN,ROLLBACK,COMMIT来实现

BEGIN:开始一个事务

ROLLBACK:事务回滚

COMMIT:事务提交

2.直接SET来改变Mysql的自动提交模式

SET GLOBAL / SESSION autocommit=0; -- 禁止自动提交
SET GLOBAL / SESSION autocommit=1;-- 开启自动提交

查看autocommit模式

SHOW GLOBAL / SESSION VARIABLES LIKE 'autocommit';

四、事务隔离级别

为什么要有隔离级别?

因为Mysql是一个服务器和客户端之间架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接之上后,就可以称之为一个会话。我们可以同时在不同的会话里输入语句,这些语句可以作为事务的一部分进行处理。

不同的会话可以同时发送请求,即服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。

虽然事务具备隔离性的特点,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交后,其他事务才可以继续访问这个数据。但是这样子对性能影响太大,所以提出了各种隔离级别,来最大限度的提升系统并发处理事务的能力。

但是只有lnnoDB支持事务,所以这里所说的事务隔离级别是指InnoDB下的事务隔离级别。

1.查看隔离级别

SELECT @@session.transaction_isolation,@@transaction_isolation;

2.设置隔离级别

1)读未提交

(read uncommitted):一个事务可以读取到另一个事务未提交的修改。

问题:会带来脏读(垃圾数据,别的事务可能会回滚),不可重复读,幻读的问题。

即当另一个事物正在修改数据,但是还没有提交,可能会发生回滚,若此时事物正在执行某些操作,还会读到另一个未回滚前的数据。用select测试比较好。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

2)读已提交

(read committed):一个事务只能读取到另一个事务提交后的数据。

解决了脏读问题,但是没有解决可重复读和幻读问题。

不可重复读:一个事务在同一次的读操作中,先后读取了两次数据,结果两次数据不一致,称为不可重复读。

造成这种现象的原因可能是另一个事务的修改操作还没有提交,所以读操作可能会读到两次数据不一致。

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

3)可重复读

(repeatable read Mysql中默认的隔离级别):一个事务在同一次事务中,多次读取同一个数据是是一致的。即使别的事物修改并提交了数据,也是一致的。(第二次与第一次读取结果一致)

解决了不可重复读问题,但是没有完全解决幻读问题

幻读:同一个事务中,读取了两次,结果读到的数据数量不同,称为幻读。

可重复读:可以解决正常的查询语句中出现的幻读问题,但是在查询语句的后面,如果添加了for update,就会出现幻读问题。

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

例如:事务1不加for update执行时,事务2添加一行记录后并且提交,事务1不会出现幻读,但是当事务1加了for update后执行,事务2添加一行记录后并且提交,事务1会出现幻读。

4)串行化

(serializable):事务串行执行,即事务只能一个一个地执行,即使一个事务写,另一个事务读也不可以。

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE

五、事务实现原理

1.原子性实现

实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。mysql使用的是undo log日志文件,用来记录增删改的反向操作。如果事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

undo log属于逻辑日志,它记录的是sql执行相关信息。当发生回滚时,执行对应操纵的反向操作即可还原。

insert--->delete

delete--->insert

update--->update

2.持久性实现

(mysql保证数据不丢失)

当数据库事务提交后,保证数据时不可撤销。当sql发送到mysql后,事务还未提交之前,如果发生断电/宕机,会将sql保存到redo log日志文件中,在mysql重新启动时,执行redo log中的sql

redo log叫做重做日志,是保证事务持久的重要机制。

3.隔离性实现原理(MVCC)

mvcc:

多版本并发机制,为了提高并发访问,读写可以同时进行。每次事务对某条记录操作时,会生成一个操作的版本链。

如果隔离级别是读已提交:

在同一个事务中,每次读取时,都会从版本链上生成一个快照(readView),每次读到的是查询时最新数据,也称为当前读。

如果隔离级别是可重复读:

在事务第一次读取数据时,会从版本链上生成一个快照(readView),之后再次读取时,仍然从上次的版本快照中读取,所以可实现重复读。也称为快照读。

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

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

相关文章

二叉树的锯齿形遍历,力扣

目录 题目: 我们直接看题解吧: 快速理解解题思路小建议: 解题方法: 相似题目对比分析: 解题分析: 解题思路: 补充说明: 思路优化: 代码实现(层序遍历倒序): 题…

MySQL进阶45讲【12】为什么你的MySQL偶尔会卡一下

1 前言 平时的工作中,不知道大家有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持…

企业计算机服务器中了halo勒索病毒如何解密,halo勒索病毒数据恢复

对于众多的企业来说,数据是一个企业的发展的根基,通过数据可以更好地规划调整企业的发展方向,提高企业生产效率。但网络是一把双刃剑,网络技术的发展不仅会为企业带来极大便利,但也为企业数据安全带来严重威胁。近期&a…

如何决定K8S Pod的剔除优先级

在Kubernetes(k8s)中,当节点资源面临压力时,如何决定Pod的优先级是一个关键问题。在Kubernetes 1.8版本之后,引入了基于Pod优先级的调度策略,即Pod Priority Preemption。这种策略允许在资源不足的情况下&a…

复旦微zynq amp 多核使用

1. 创建 helloworld 工程 2. 将 iar 工程复制四份,并更名为SDK0,1,2,3,4 3. 修改四个工程的 cstartup.s 文件,参考下图: 4. 修改初始化代码,fsbl 里边已经将 DDR 等硬件初始化好了,注释掉哦 app 中的初始化 代码,避免…

Three.js蒙皮骨骼变化原理 | 逆推蒙皮网格的世界位置

文章目录 关于蒙皮的GPU计算:源码解析转换成CPU可执行的代码:法线部分 蒙皮骨骼的变化是在GPU中进行的 , 所以像获取静态物体一样获取geometry.position是不行的 查看当前版本(r160)的shader 关于蒙皮的GPU计算: unif…

坚持刷题 | 二叉树的直径

文章目录 题目考察点代码实现实现总结方便用迭代的方式实现吗?迭代实现迭代实现总结 Hello,大家好,我是阿月。坚持话题,老年痴呆追不上我,今天还有时间,那就再来一题吧:二叉树的直径 题目 543.…

【数据分享】1929-2023年全球站点的逐日降水量数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,说到常用的降水数据,最详细的降水数据是具体到气象监测站点的降水数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全…

网络爬虫,使用存放在C的谷歌驱动报错

月 06, 2024 11:43:40 上午 org.openqa.selenium.os.OsProcess checkForError 严重: org.apache.commons.exec.ExecuteException: Execution failed (Exit value: -559038737. Caused by java.io.IOException: Cannot run program "C:\chromedriver121.exe" (in dir…

预处理详解(下)

8. 命名约定 ⼀般来讲函数的宏的使⽤语法很相似。所以语⾔本⾝没法帮我们区分⼆者。 那我们平时的⼀个习惯是: 把宏名全部⼤写 函数名不要全部⼤写 9. #undef 这条指令⽤于移除⼀个宏定义。 # undef NAME // 如果现存的⼀个名字需要被重新定义,那么…

vue3-内置组件-TransitionGroup

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 与 <Transition> 的区别 <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器&…

编程实例分享,宠物诊所电子处方怎么开,兽医电子处方模板电子版操作教程

编程实例分享&#xff0c;宠物诊所电子处方怎么开&#xff0c;兽医电子处方模板电子版操作教程 一、前言 以下操作教程以 佳易王兽医电子处方软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在系统 设置里可以设置打印参数&#x…