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的事务隔离级别". 他竟然没有回答上来,一直在私信向我诉苦. 我说,你只能怪年轻时候的你,那个时候不够努力导致现在 ...
随机推荐
- 华为5G在印度被禁
前段时间,澳大利亚政府以“担心外国渗透”为由,决定禁止华为为建设新的5G网络提供设备.这让大家不禁猜测,难道华为的5G真的被国外市场禁入了? 对此,华为表达出了极大的失落感,并在一份声明中称,“政府告 ...
- [poj2528]Mayor's posters
题目描述 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campa ...
- FreeRTOS 中 systick 相关配置
@2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...
- 对 static const char* const str[] = {“string”} 的理解
static const char* const str[] = {“string”} 静态常量型指针变量 static const char* 常量型变量 const str[] 这样修饰的作用为 ...
- luogu4267 TamingtheHerd (dp)
设f[i][j]为让前i天发生j次暴动需要改变的最少的值 则f[i][j]=min{f[k][j-1]+(x[k+1]!=0)+(x[k+2]!=1)+...+(x[i]!=(i-k-1))} $O( ...
- Mysql服务器处理客户端请求流程
在日常执行mysql语句的过程中,都是客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果). 看似很简单,其实不然,这内容有很多东西是需要注意的 ...
- NOIP2016 巨凉无比的感言
打一场比赛检验自己的水平. D1: 我日苟了,考得跟屎一样. 第一题不说了,奇水无比(跟17年相比的话). 第二题,大名鼎鼎啊... 虽然以前看过题解但是实际做起来只会25分暴力...至少比半年前好多 ...
- JAVA8给我带了什么——并行流和接口新功能
流,确定是笔者内心很向往的天堂,有他之后JAVA在处理数据就变更加的灵动.加上lambda表达不喜欢都不行.JAVA8也为流在提供另一个功能——并行流.即是有并行流,那么是不是也有顺序流.没有错.我前 ...
- A1044. Shopping in Mars
Shopping in Mars is quite a different experience. The Mars people pay by chained diamonds. Each diam ...
- NO.8:绝不在构造或者析构过程中调用virtual函数
在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数) 如果在base class 构造函数或者析构函数调用virtual ...