MySQL夯实之路-事务详解

事务四大特性

事务需要通过严格的acid测试。Acid表示原子性,一致性,隔离性,持久性。

原子性(atomicity)

事务是不可分割的最小单元,对于整个事务的操作,要么全部提交成功,要么全部失败回滚。

一致性(consistency,最重要)

数据库总是从一个一致性的状态转换到另一个一致性的状态。要求几个事务并发执行的结果与串行顺序执行的结果一致。

隔离性(isolation)

通常,一个事务的修改在提交前对其它事务不可见。事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的(一个事务不会被另一个事务影响,最理想的就是等待一个事务执行完成后再执行另一个事务,但处于性能上的考虑,一般都需要事务并发执行,就要求事务执行过程中不受到并行执行的事务的影响,例如不能读取到另一个未提交(提交就是指事务执行完成)事务写入的值。

持久性(durability)

事务提交后,其修改永久保存在数据库中(但不可能有100%持久性保证)

原子性是基础,隔离性是手段,一致性是约束条件,目的是保持持久性。

隔离级别

Mysql标准中有四种隔离级别

未提交读

没有提交的事务的修改对其它事务可见。会发生脏读(事务读取未提交的数据)

提交读

没有提交的事务的修改对其它事务不可见,提交的事务的修改对其它事务可见。会发生不可重复度(两次执行相同查询可能结果不一样)

可重复读(innoDB默认)

在同一个事务上读取相同的记录的结果是一致的。会发生幻读(一个事务前后两次查询相同范围,后一次查询看到了前一次查询没有看到的行,原因是另一个事务中间插入了新的记录),innoDB和xtradb存储引擎通过了多版本并发控制(MVCC,multiversion concurrency control)解决了幻读问题

可串行化

在读取的每一行数据上加锁。避免了幻读,但导致了大量超时和锁争用问题

从上往下隔离级别越高,效率越低,越安全

死锁

如果两个事务都获得了一把锁,双方又需要获取对方已经获得的锁,这时会发生死锁。

innoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚

死锁的产生可能与存储引擎有关

事务日志

使用事务日志,存储引擎在修改表的数据时,只要修改其内存拷贝,再把修改行为记录到硬盘上的事务日志上,在后台再慢慢地刷回到磁盘。通常称为预写式日志(wal,write-ahead logging),先写入日志,再写入磁盘,修改数据需要写两次磁盘。

事务只要能记录到日志并持久化成功,系统崩溃也不会丢失

Mysql的事务

Mysql有两种事务型存储引擎innoDB,NDB Cluster。还有第三方的,如XtraDB PBXT

MySQL在开启事务时会切换到延缓操作的状态:操作并不会立刻执行,commit时才会执行并切换为自动提交状态,rollback时会将延缓操作丢弃,释放申请到的锁(关键),切换为自动提交状态。

自动提交(autocommit)

Mysql默认采用自动提交(autocommit)模式。即如果不是显示开启一个事务,每次查询默认为一个事务

Mysql服务器不管理事务,事务由存储引擎实现。在同一个事务中使用多个存储引擎是不可靠的(如果在事务中混合使用了事务型和非事务型得存储引擎,在回滚时非事务型表无法撤销,事务的最终结果不确定,难以修复),mysql事务型对非事务型表回滚时会警告,通常不会有提示

隐式和显式锁定

innoDB采用两阶段锁定协议。事务执行过程中随时可以执行锁定,只有在执行commit或者rollback时同时释放所有锁(前面描述的锁都是隐式的,innoDB会根据隔离级别在需要的时候自动加锁,也支持特定的语句进行显式锁定,但不属于sql规范,应该尽量避免)

Mysql也支持lock tables和unlock tables语句,但由服务器实现,和存储引擎无关,但并不用于事务处理,使用事务还是要使用事务型存储引擎(除了事务中禁用了autocommit,可以使用lock tables外,不要显式使用lock tables)

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

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

相关文章

xtdrone用键盘控制无人机飞行 无法起飞

运行案例 解锁无人机螺旋桨转动但无法起飞 也未报错 解决方法: 在QGC中修改:PX4飞控EKF配置 将PX4使用的EKF配置为融合GPS的水平位置与气压计高度。 如果我们想使用视觉定位,就需要把修改配置文件。 此修改意味着EKF融合来自mavros/vision_…

canvas设置渐变色文字(线性、径向)

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

【JAVA】谈谈 ReadWriteLock 和 StampedLock

🍎个人博客:个人主页 🏆个人专栏:JAVA ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 ReadWriteLock(读写锁) 基本原理: 接口和实现: 用法示例: StampedL…

统信UOS_麒麟KYLINOS与Windows通过Open SSH实现文件传输

原文链接:统信UOS/麒麟KYLINOS与Windows通过Open SSH实现文件传输 hello,大家好啊!今天我要给大家介绍的是在统信UOS或麒麟KYLINOS操作系统与Windows系统之间通过Open SSH实现文件传输的方法。在日常工作中,我们经常需要在不同操作…

使用Pygame库来显示一个简单的窗口,并绘制一些基本的形状和文本

import pygame from pygame.locals import *# 初始化pygame库 pygame.init()# 创建窗口并设置大小和标题 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("My Pygame")# 定义颜色…

leetcode 2645. 构造有效字符串的最少插入数-python

题目: 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

七麦数据js逆向(补环境版)

本文目标地址如下,使用base64解码获得 aHR0cHM6Ly93d3cucWltYWkuY24vcmFuay9tYXJrZXRSYW5rL21hcmtldC82L2NhdGVnb3J5LzUvY29sbGVjdGlvbi9hbGwvZGF0ZS8yMDI0LTAxLTEy 本文逆向破解分为扣代码版和补环境版,扣代码版请看专栏另一篇文章 废话不多说了&#…

电脑上不安装Oracle,但是虚拟机装了Oracle,怎么连接到虚拟机里的Oracle数据库呢?

1、准备工作 1.1、确定数据库版本信息 注:如果知道数据库的版本信息,这个步骤可以跳过。 比较简单的方法,直接看数据库的安装位置,也就是数字(但是这个方法确定就是,不好确定是多少位的数据库)…

python 语法

闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包。 def outfunc(arg):def innerFunc(msg):print(f"<{msg}> {arg} <{msg}>")retu…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片&#xff0c;结果如下&#xff0c;报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题&#xff0c;名字太过于复杂&#xff0c;PicGo识别不出&#xff0c;一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

掌握 Vue 响应式系统,让数据驱动视图(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

使用Pygame库创建了一个窗口,并在窗口中加载了一个名为“ball.png“的图片,通过不断改变物体的位置,实现了一个简单的动画效果

import pygame import sys# 初始化Pygame pygame.init()# 创建窗口 screen pygame.display.set_mode((640, 480))# 加载图片 image pygame.image.load("ball.png")# 将物体初始位置设为屏幕左上角 x 0 y 0# 游戏循环 while True:# 处理事件for event in pygame.e…