mysql-笔记 隔离级别、事务
1 隔离级别:低级别的隔离通常可以执行更高的并发,系统 开销也更低
2 Read uncommitted:事务可以读取未提交的数据,脏读,应少用
3 read committed:不可重复读,事务只能看见已提交的事务所做的修改,大多数数据库使用这一级别,mysql不是
4 repeatable read: 可重复读,在同一个事务中多次读取同样记录结果是一致的。可能幻读:指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该 范围内的记录时,会产生幻行。
mysql 默认的事务隔离级别
5 serializable:可串行化 ,会在读取的每一行数据上加锁,可能导致大量的超时和锁争的问题。是最高的隔离级别,通过强制事务串行执行,避免了前面说的幻读的问题。
实际少用,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下才考虑
6 锁:两个或多个事务在同一资源上相互占用,并请求锁对方占用的资源,多个事务试图以不同的顺序锁定资源时或多个事务同时锁定一个资源时,产生死锁。
innoDB处理方式:将持有最少行级排他锁的事务进行回滚
锁的行为和顺序是和存储引擎相着的。以同样的顺序执行语句,有些引擎会产生死锁,有些则不会。死锁产生有双重原因,有些是真正的数据冲突,难避免,有些则是由于存储引擎的实现方式导致的。
打破死锁:部分或全部回滚其中的一个事务
7 mysql提供了两种事务型的引擎:innoDB NDBCluster
第三方存在引擎 :xtraDB PBXT
自动提交:mysql默认采用自动提交模式,可以用show variables like 'autocommit'; 可看,set autocommit=1 ; 开启
1 或者 on 表示 启用;0 或 off 表示禁用
autocommit=0时,所有的查询都是在一个事务中,直到显式的执行commit 提交或rollback回滚该事务结束同时又开始一个新的事务。
对于非事务型的表:myisam或 内存表,不会有影响,一直处于autocommit启用模式,另外有些伪命令在执行前会强制执行commit提交当前事务:alter table .lock table
mysql可以通过执行 set transaction isolation level命令设置隔离级别,新的隔离级别会在下一个事务开始时生效,可以在配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别
set session transaction isolation level read committed
mysql能够识别所有的4个ANST隔离级别,InnoDB引擎也支持所有的隔离级别
8 在事务中混合使用存储引擎:mysql服务器层不管理事务,事务是由下层的存储引擎实现的。所以在同一事务中,使用多种存储引擎是不可靠的。回滚时非事务型的表上的变更不能被回滚。
9 Innodb 采用2阶段锁定协议,在事务执行过账中,随时都可以执行锁定,锁只有在执行commit或者rollback的时候才会释放,并且所有的锁是在同一时刻被释放。innodb会根据隔离级别在需要的时候自动加锁
innodb也支持通过特定的语句显式锁定,这些语句不属于sql规范:select ....lock inshare mode; select ... for update
mysql 也支持lock tables unlock tables 语句,这是在服务器层实现的,和存储引擎无关。不册 替代事务处理。
innodb的行级锁工作得比lock table语句好。在innodb中的可以去掉lock table语句
10 多版本并发控制:MVCC 通过保存某个时间点的快照来实现的
分:乐观并发控制
悲观并发控制
InnoDB 的MVCC是通过在每行记录后面保存2个隐藏的列来实现的。一个保存行的创建时间,一个保存行的过期时间或删除时间。存储的是系统版本号。每开始一个新的事务、系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询列的每行记录的版本号进行比较。
repeatable read隔离级别下:
select INNODB 根据2个条件检查每行记录:
1 查找版本早于当前事务版本的数据行
2 行的删除版本要么未定义,要么大于当前事务版本号。只有符合2个条件才返回作为查询结果
insert :为新增插入的每一行保存当前系统版本号作为行版本号
delete:为删除的每一行保存当前系统版本号作为行删除标识
update: 为插入一行新记录保存当前系统版本号作为版本号,同时保存当前系统版本号到原来的行作为删除标识。
MVCC只在repeatable read/read committed下工作
mysql-笔记 隔离级别、事务的更多相关文章
- Mysql得隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- Mysql的隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- mysql数据库隔离级别
# 原创,转载请留言联系 事务的隔离级别 (由高到低)1.串行化(serializable):一个事务一个事务的执行2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交 ...
- MYSQL事件隔离级别以及复读,幻读,脏读的理解
一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2 ...
- mysql验证隔离级别
mysql更改隔离级别 参考https://blog.csdn.net/qq_21299835/article/details/121189565 关闭mysql事务自动提交:set autocomm ...
- MySQL 不同隔离级别,都使用了什么锁?
大家好,我是树哥. 在上篇文章,我们聊了「MySQL 啥时候会用表锁,啥时候用行锁」这个问题.在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此外,还有朋友留言 ...
- mysql 数据库隔离级别
select @@tx_isolation; 4种隔离级别 1.read uncommitted 2.read committed 3.repeatable read(MySQL默认隔离级别) 4. ...
- [原创]MySQL RR隔离级别下begin或start transaction开启事务后的可重复读?
Server version: 5.6.21-log MySQL Community Server (GPL) 前提提要: 我们知道MySQL的RR(repeatable read)隔 ...
- spring事务和mysql的隔离级别
mysql事务.mysql隔离级别.mysql锁.mysql数据一致性.Spring事务.Spring事务传播性之间的关系 一直有些模糊,整理一下. mysql事务: 在mysql中,只有使用了I ...
- MySQL 中隔离级别 RC 与 RR 的区别
1. 数据库事务ACID特性 数据库事务的4个特性: 原子性(Atomic): 事务中的多个操作,不可分割,要么都成功,要么都失败: All or Nothing. 一致性(Consistency): ...
随机推荐
- SQL自动生成java实体类POJO
前言 当我们设计完成数据库之后,通常需要创建对应的实体类,有的称为Entity,有的称为DO,都是一个意思,而自己一个个去写非常的麻烦,所以麻烦的时候就需要相应的自动工具类解决这样的麻烦.超级方便~ ...
- Python:黑板课爬虫闯关第一关
近日发现了[黑板课爬虫闯关]这个神奇的网页,练手爬虫非常的合适 地址:http://www.heibanke.com/lesson/crawler_ex00/ 第一关非常的简单 get 请求网址,在响 ...
- 使用 线性规划 解决 数字 排序问题, +Leapms模型
问题 将如下一组数字从大到小排序. {10, 20, -32, 177, 0, -11.5, 19, 7, 6.2, -6.28, -2.71, 44} 解决办法 建立数学模型,给出各个数字的次序值. ...
- WPF ResourceDictionary 主题资源替换(一)
当我们需要在程序中替换主题,更换另一套背景.颜色.样式时,如何在不修改资源Key值,直接替换呢? 问题&疑问 1. Key值冲突 同一ResourceDictionary中,不可以使用相同Ke ...
- dubbo-源码分析Provider
Dubbo provider启动原理: 当我们的dubbo启动我们的spring容器时spring 初始化容器的时候会查找META-INF/spring.handles文件查找对应的Namespace ...
- centos 7下安装jdk1.8
本篇文章主要介绍在centos7 环境下安装jdk1.8并配置环境变量. 安装步骤 1.下载网址 https://www.oracle.com/technetwork/java/javase/do ...
- nginx系列9:HTTP反向代理请求处理流程
HTTP反向代理请求处理流程 如下图:
- 判断值是否为undefined
可以使用 Ext.isDefined( value ) 这个函数, 也可以使用下面代码来进行实现: /** 判断传入的值是否 为undefined */ function isUndefined(va ...
- javascript排序算法-选择排序
选择排序 概念:选择排序大致的思路是找到数据结构中的最小值并将其放置在第一位,接着找到第二小的值并将其放在第二位,以此类推. 复杂度: O(n^2) 代码实现 var swap = function ...
- Spring注入对象(3)
2019-03-08/10:45:04 演示:对Product对象,注入一个Category对象 1.创建pojo类 Product类中有对Category对象的setter getter packa ...