mysql 原理 ~ 事务隔离机制
简介: 事务隔离知多少
内容
一 基础知识
1 事务特性 ACID
A 原子性 C 一致性 I 隔离性 D 持久性
2 并行事务出现的问题
1 脏读 读取了其他事务未提交的数据
2 不可重复性读 1 在同一个事务内多次查询的结果不一致 2 可以通过for update or RR模式的MVCC避免这种现象 3 针对的是update/delete操作
3 幻读 1 当前事务读第一次取到的数据比后来读取到数据条目少 通过 next key lock避免
这里要注意
官方文档实际要表达的意义是“在同一个事务内,多次连续查询的结果是一样的,不会因其他事务的修改而导致不同的查询结果”
当前事务如果未发生更新操作(增删改),快照版本会保持不变,多次查询读取的副本是同一个;当前事务如果发生更新(增删改),再次查询时,会刷新快照版本
3 mysql隔离级别
RU 读未提交 -> 其他事务可以读取未提交的事务
RC 读已提交 -> 其他事务只能读取已提交的事务 可以避免(脏读) 不可避免(不可重复性读和幻读) 锁(record lock)
RR 可重复性读-> 本事务在事务内多次读取的事务是一致的,不会产生变化,直到本事务提交 可以避免(脏读,不可复重复性读和幻读) 锁(record lock+gap lock)
SE 串行化->事务之前是串行化执行的,包括select
4 默认隔离级别
mysql rr级别 oracle rc级别
oracle应用迁移到mysql的时候要注意
金融级别的建议使用RR
5 可重复性读和读已提交的区别
1 可重复性读是在事务开始的时候只创建一次视图函数 直到事务结束 效果等同于(start transaction with consistent snapshot) 查询事务开启前提交的数据
2 读已提交是在每次执行的时候都创建一次视图函数 直到事务结束 查询在事务内语句前提交的数据
6 RR模式下的更新问题
问题描述 在RR模式下 select搜索的是旧库的快照,但是update更新的是新库的数据,导致更新问题
问题解决 在读取的过程中设置一个排他锁,在 begin 事务里, select 语句中增加 for update 后缀,这样可以保证别的事务在此事务完成commit前无法操作记录
7 快照的实现
1 事务开始时会向mysql申请一个transation id
2 事务中每行的变更被称为一个版本
3 每个版本都会导致trx_id(赋值为row_id)递增,作为标记版本
4 而数据版本的可见性规则,就是基于数据的 row trx_id...
5 快照是基于库做的
8 id自增长知多少
1 thread_id
内容 show processlist的第一列就是thread_id,用来进行标注
2 trx_id
内容 用来维护一致性读场景
3 xid
内容 用来维护二次提交的事务一致性(redo and binlog必须xid一致)
9 在生产环境中究竟是用RR还是RC模式
这取决与你的业务查询,因为RR和RC模式的根本区别在于采用select获取结果的不同可能性,如果你的业务依赖于大量的一致性读,就不该采用RC模式,如果只是少量的一致性读,则可以采用rc模式,一致性读用for update实现
mysql 原理 ~ 事务隔离机制的更多相关文章
- 理解MySql事务隔离机制、锁以及各种锁协议
一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念假设串起来足够写一本书,所以在这里给自己梳理一 ...
- 一文读懂MySQL的事务隔离级别及MVCC机制
回顾前文: 一文学会MySQL的explain工具 一文读懂MySQL的索引结构及查询优化 (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论不一定适用于其他版本) 就软件开 ...
- [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]
[MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...
- MySQL实战 | 03 - 谁动了我的数据:浅析MySQL的事务隔离级别
原文链接:这一次,带你搞清楚MySQL的事务隔离级别! 使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity).一致性(Consistency ...
- MySQL之事务隔离级别--转载
转自:http://793404905.blog.51cto.com/6179428/1615550 本文通过实例展示MySQL事务的四种隔离级别. 1 概念阐述 1)Read Uncommitted ...
- 重新学习MySQL数据库8:MySQL的事务隔离级别实战
重新学习Mysql数据库8:MySQL的事务隔离级别实战 在Mysql中,事务主要有四种隔离级别,今天我们主要是通过示例来比较下,四种隔离级别实际在应用中,会出现什么样的对应现象. Read unco ...
- 【MySQL】事务隔离级别及ACID
注:begin或start transaction并不是一个事务的起点,而是在执行它们之后的第一个操作InnoDB表的语句,事务才真正开始.start transaction with consist ...
- mysql数据库——事务隔离级别
四种隔离级别: 一:READ UNCOMMITTED(未提交读) 事务可以读取其他事务未提交的数据,称为脏读 二:READ COMMITTED(提交读) 一个事务开始时,只能"看见" ...
- 【Java面试】请你简单说一下Mysql的事务隔离级别
一个工作了6年的粉丝,去阿里面试,在第一面的时候被问到"Mysql的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...
随机推荐
- docker --swarm创建一个集群
如果搭建错误可以强制脱离集群网络: docker swarm leave --force 初始化集群网络管理节点: docker swarm init --advertise-addr 10.101. ...
- BZOJ3996[TJOI2015]线性代数——最小割
题目描述 给出一个N*N的矩阵B和一个1*N的矩阵C.求出一个1*N的01矩阵A.使得 D=(A*B-C)*A^T最大.其中A^T为A的转置.输出D 输入 第一行输入一个整数N,接下来N行输入B矩阵, ...
- 最短路径——SPFA算法
一.前提引入 我们学过了Bellman-Ford算法,现在又要提出这个SPFA算法,为什么呢? 考虑一个随机图(点和边随机生成),除了已确定最短路的顶点与尚未确定最短路的顶点之间的边,其它的边所做的都 ...
- Zabbix3.0学习笔记
第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也 ...
- JAVA内部类小结
内部类的概念:定义在其他类里面的类叫做内部类,包含内部类的类叫做外部类: 内部类的作用:内部类主要是用来描述一个事物存在于另一个事物里面,依赖于外部事物存在的: 内部类的格式: 内部类的分类: 成员内 ...
- 自学工业控制网络之路1.6-典型的现场总线介绍Interbus
返回 自学工业控制网络之路 自学工业控制网络之路1.6-典型的现场总线介绍Interbus 1987年正式公布,其主要技术开发者为德国的PhoenixContact公司.1996年,INTERBUS成 ...
- 【转】安全加密(五):如何使用AES防止固件泄露
本文导读 随着电子产品更新换代速度的加快,往往都会进行系统升级或APP功能维护升级,但是由此产生了两个主要问题.首先,由于更新过程中出现错误,该设备可能变得无用:另外一个主要问题是:如何避免未经授权的 ...
- Shell基础知识(五)
shell中同样有数组的概念,获取数组中的元素要使用下标[],并且下标的值必须大于等于0.数据的各项特性见下例: #!/bin/bash array1=(1 2 3 999) echo ${array ...
- C# 推箱子游戏&对战游戏
推箱子游戏提纲,只有向右向上的操作,向左向下同理,后期需完善. namespace 推箱子 { class Program { static void Main(string[] args) { // ...
- mybatis返回部分字段为空的问题
问题: 在数据库查询的时候可以正常返回值,在程序中只能返回一部分字段,其他字段为null. 错误原因: 将resultType改为resultMap https://www.cnblogs.com/i ...