首页 > 数据库 >Mysql事务原理与优化最佳实践

Mysql事务原理与优化最佳实践

时间:2024-04-28 23:33:06浏览次数:26  
标签:事务 隔离 优化 查询 修改 提交 Mysql 级别

学习来源-图灵课堂

https://vip.tulingxueyuan.cn

说到MySQL的innodb的一大特性,就不得不说到事务。今天就学习事务。

事务

事务的定义:逻辑上的一组操作,要么一起成功,要么一起失败,中间绝对不会存在别的状态。逻辑上的一组操作,就是说这些操作都是有逻辑关系的。

我们通常说的事务是针对修改操作(新增,编辑,删除),但是查询操作也是可以加事务的。

事务有四大特性:ACID,就是所谓的原子性,一致性,隔离性,持久性。其中一致性是其它三个特性都满足之后才能实现的。

  1. 原子性(Atomicity) :当前事务的操作要么同时成功,要么同时失败,从效果上看一体的。原子性由undo log日志来实现。针对修改操作,undo log中会写入和其完全相反的一句SQL,便于rollback;rollback和commit是保证原子性的。
  2. 一致性(Consistent) :使用事务的最终目的,由其它3个特性以及业务代码正确逻辑来实现。
  3. 隔离性(Isolation) :在事务并发执行时,他们内部的操作不能互相干扰。隔离性由MySQL的各种锁以及MVCC机制来实现。
  4. 持久性(Durable) :一旦提交了事务,它对数据库的改变就应该是永久性的。持久性由redo log日志来实现。

并发事务带来的问题

  • 更新丢失(Lost Update)或脏写:当两个或多个事务选择同一行数据修改,有可能发生更新丢失问题,即最后的更新覆盖了由其他事务所做的更新。
  • 脏读(Dirty Reads):事务A读取到了事务B已经修改但尚未提交的数据,回滚之后数据无效。
  • 不可重读(Non-Repeatable Reads):事务A内部的相同查询语句在不同时刻读出的结果不一致。主要是针对查询单条数据,别的事务可能对这行数据进行了修改。
  • 幻读(Phantom Reads)或者是幻读:事务A读取到了事务B提交的新增数据。主要是读期间别的事务执行了插入操作。每次读取都能得到新的数据。

事务隔离级别

事务隔离级别是数据库本身提供的功能。都有其默认值,但是也可以进行修改的。可以根据业务需求去决定是否要修改默认的隔离级别。
隔离级别
脏读(Dirty Read)

不可重复读

幻读(Phantom Read)
读未提交(Read uncommitted) 可能   可能  可能
读已提交(Read committed) 不可能 可能 可能
可重复读 (Repeatable read)  不可能 不可能 可能
可串行化 (Serializable)  不可能 不可能 不可能
                事务隔离级别越高,其安全性一致性就越好,但是相应的其执行效率就越低。 不同的业务场景针对事务隔离级别有要求,可以针对的进行设置。 MySQL默认的隔离级别是可重复读;Oracle默认的隔离级别是读已提交。 用Spring开发程序时,如果不设置隔离级别默认用数据库设置的隔离级别,如果Spring设置了就用已经设置的隔离级别。  

事务隔离级别的具体实现

  • 读未提交,没有进行任何额外处理,其数据库执行效率是最高的,但是其数据库安全性是最低的, 要在业务侧保证事务的执行。
  • 读已提交,此时是读的当前,当前读就是时刻读取当前的最新已经提交的值。
  • 可重复读,引入了MVCC和锁机制去保证。其中MVCC就用到了快照读,就是读的历史版本;锁机制,提高间隙锁等。
  • 可串行化,是严格的加锁机制,读写互斥,写写互斥,读读不互斥。是类似Java的悲观锁。效率极其低下。
                     

 

真实的数据只是会维护一份;不同线程的查询是通过整个版本链来查的。所有的查询修改共同构成这条数据的版本链。

每次数据的修改,都会有自己的一套版本链。查询的时候,就是通过可见性算法去定位到自己要查询的版本。

并不是多个快照,多个日志,多条真实数据;这样的话就太占用空间了。

标签:事务,隔离,优化,查询,修改,提交,Mysql,级别
From: https://www.cnblogs.com/0630sun/p/18164147

相关文章

  • vue优化
    使用key对于通过循环生成的列表,应给每个列表项一个稳定且唯一的key,这有利于在列表变动时,尽量少的删除、新增、改动元素使用冻结的对象冻结的对象不会被响应化使用函数式组件参见函数式组件使用计算属性如果模板中某个数据会使用多次,并且该数据是通过计算得到的,使用计算属性......
  • mysql理论数据库优化MySQL数据库面试题
    mysql数据库优化MySQL数据库面试题 MySQL数据库面试题MySQL数据库面试题1、什么是SQL?        结构化查询语言(StructuredQueryLanguage)简称SQL,是一种数据库查询语言。作用:用于存取数据、查询、更新和管理关系数据库系统。 2、什么是MySQL?        M......
  • 日志分析-mysql应急响应
    简介mysql应急响应ssh账号root密码xjmysqlsshenv.xj.edisec.net-pxxxxx1.黑客第一次写入的shellflag{关键字符串}2.黑客反弹shell的ipflag{ip}3.黑客提权文件的完整路径md5flag{md5}注/xxx/xxx/xxx/xxx/xxx.xx4.黑客获取的权限flag步骤#1步骤#2/var/l......
  • yum安装mysql报错--您可以尝试添加 --skip-broken 选项来解决该问题 清除缓存命令
    yum安装mysql报错--您可以尝试添加--skip-broken选项来解决该问题    安装mysql时,如果安装报错,首先删除缓存,    1、清除缓存  yumcleancache    2、重新加载  yummakecache    3、重新安装  yuminstallmysql    此......
  • Linux Centos7 虚拟环境安装Mysql数据库(超详细图文讲解)
    LinuxCentos7虚拟环境安装Mysql数据库(超详细图文讲解)1、进入Centos7虚拟机,使用wget下载Mysql相应的rpm包下载:wgethttp://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm如果没有wget命令,可以使用yum安装,yuminstallwget2、执行rpm命令,安装rpmrpm-ivhmys......
  • Aliyun服务器部署MySql 8.0
    Aliyun服务器部署MySql8.0一、安装MySQL复制相应版本;下载wget-i-chttps://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm1安装yum-yinstallmysql80-community-release-el8-1.noarch.rpm12、安装MySQL服务器安装命令(可以先执行下一步操作,再来......
  • Linux在线安装Mysql教程(超详细超简单 全程复制语句即可)
    Linux在线安装Mysql教程(超详细超简单全程复制语句即可)Linux在线安装Mysql安装mysql1.下载yumRepository2.安装yumRepository3.安装mysql5.7的服务4.设置开机自启动5.启动mysql6.查看状态7.获取临时密码8.登录mysql9.关闭密码复杂验证10.设置密码11.修改权限12.卸载yu......
  • mysql数据库转oracle数据库
    mysql->oracle前言今天的任务是把用mysql数据库编写的程序转成oracle,这也是我第一次用oracle可谓是错误百出啊。下载oracle?NO在公司我们不需要本地下载oracle,(如果你是想自己学习当我没说,不魔法下载很慢,有时间我会写一篇系统性的文章写oracle的运用),当我下载完oracle本地数据库......
  • matlab使用Copula仿真优化市场风险数据VaR分析
    原文链接:http://tecdat.cn/?p=4305原文出处:拓端数据部落公众号 使用Copula建模相关默认值 此示例探讨了如何使用多因素copula模型模拟相关的交易对手违约。鉴于违约风险敞口,违约概率和违约信息损失,估计交易对手组合的潜在损失。一个creditDefaultCopula对象用于每个债务人......
  • MySQL函数详解
     CONCAT()用途:连接两个或多个字符串。示例:sql`SELECTCONCAT('Hello','','World')ASGreeting;` 这将返回 'HelloWorld'。LOWER()和UPPER()用途:将字符串转换为小写或大写。示例:sql`SELECTLOWER('HELLO')ASLowercase,UPPER(&#......