MySQL-(InnoDB)事务和锁
在事务并行处理背景下,不同的事务之间因数据共享的状态变化,存在着某种依赖/隔离影响。即事务隔离级别。
事务隔离级别,官网的解释在这里。
InnoDB提供 SQL:1992 标准描述的所有四种事务隔离级别: READ UNCOMMITTED、 READ COMMITTED、 REPEATABLE READ和 SERIALIZABLE。
InnoDB默认的隔离级别是 REPEATABLE READ。
READ UNCOMMITTED(未提交读):即一个事务可以读到另一个事务未提交的“中间状态”数据。也叫脏读。好比A和B在画画,A想看看B的绘画结果,
但是B还没画完,A就拍照走了。实际B的画没有完成;A只是拿了一个中间状态。
READ COMMITTED(提交读):即一个事务不可读到另一个事务未提交的“中间状态”数据。可以避免脏读。但是会发生两次读到的数据不一致问题。
也叫不可重复读。还是A和B画画举例,A在B画画之前读一次,B画完后读一次。A读了两次读到了不同的内容(想当然)。
REPEATABLE READ(可重复读):对不可重复读的改进(可以看到改进在一条条升级)。即两次读到的内容一致。举例来说,即A开始读B的画,
B即交笔停笔不允许改了。不管A读几次结果都一样。直到A结束他的读(事务)。
可重复读仍会产生幻读问题。
幻读这里有点绕,和不可重复读有点像。都是两次读到了不同的结果。不同的是:不可重复读强调查询结果的值的改变,幻读强调查询结果的范围出现了变化,
比如某行数据上一次查询没有,这一次突然出现--这是幻读问题。
The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.
SERIALIZABLE(可串行化):强制事务进行排序,将并行事务改串行,可以解决脏读,不可重复读,幻读的问题,但是需要加锁。不是很友好。

上面介绍了四种事务隔离级别和各隔离级别仍存在的问题,需要注意的是:READ UNCOMMITTED这种最低一级的隔离级别,相当于没有隔离,
实际应用中基本上不会用。SERIALIZABLE隔离级别会对每一行数据进行读写加锁,可能导致大量的超时和锁争用问题,实际应用中也很少用这个
隔离级别,除非接受没有并发,但我们也知道,基本不可能。
所以我们更多的讨论的是READ COMMITTED和REPEATABLE READ这两个事务隔离级别。
即在READ COMMITTED和REPEATABLE READ这两个事务隔离级别下,如何解决不可重复读和幻读的问题?
通过锁机制和MVCC。其中锁主要处理当前读相关问题,MVCC处理快照读相关问题。
mysql锁的分类 InnoDB Locking
根据锁的覆盖范围,重点关注:表锁,行锁,间隙锁,临键(next-key)锁
MVCC部分待续。
附录总结一
**mysql事务(ACID)的实现原理:
原子性(Atomicity): undo log
一致性(Consistency):一致性是目的,原子性、隔离性、持久性是手段。实现AID三大特性才有可能实现一致性。
隔离性(Isolation): 写写:锁(行锁,表锁,间隙锁);写读:MVCC
持久性(Durability):redo log
MySQL-(InnoDB)事务和锁的更多相关文章
- 秒杀怎么样才可以防止超卖?基于mysql的事务和锁实现
Reference: http://blog.ruaby.com/?p=256 并发事务处理带来的问题? 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从 ...
- MySQL的事务和锁
MySQL的事务和锁 阅读目录 什么是事务 事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作:这些操作作为一个整体一起向系统提交,要么都执行.要么都不执行:事务是一组不可再 ...
- MySql InnoDB中的锁研究
# MySql InnoDB中的锁研究 ## 1.InnoDB中有哪些锁### 1. 共享和排他(独占)锁(Shared and Exclusive Locks) InnoDB实现标准的行级锁定,其中 ...
- Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁
Python进阶----pymysql的安装与使用,mysql数据库的备份和恢复,mysql的事务和锁 一丶安装 pip install PyMySQL 二丶pymysql连接数据库 ### 语法: ...
- 搞懂MySQL InnoDB事务ACID实现原理
前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...
- MySQL/InnoDB中,对于锁的认识
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- 【译文】MySQL InnoDB 使用的锁分析
InnoDB 使用的 锁类型 共享锁和排它锁 意向锁 记录锁 间隙锁 Next-key 锁 插入意向锁 AUTO-INC 锁 共享锁和排他锁 InnoDB实现了俩个标准的行级锁,共享锁和排它锁. 共享 ...
- InnoDB事务和锁
InnoDB支持事务,MyISAM不支持事务. 一.事务的基本特性 ACID特性 1.原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行. 2.一致性( ...
- Mysql InnoDB事务
http://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html 事务的四个特性 1.原子性(atomicity)原子性是指整个数据库事务是 ...
- 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...
随机推荐
- Code UTF-8 Console GB2312 Linux 中文乱码
Linux 系统方法: LD_LIBRARY_PATH=. ./userdemo | iconv -f GB2312 -t utf8 Shell 方法 Shell 编码 改成GB2312 // 编 ...
- Assert的使用和简单解释
Assert 的简单使用 Document d = Jsoup.connect("http://www.baidu.com").get(); Assert.notNull(d, & ...
- manu check RAID GEM count and Fragment count of local FN>1
cat MANU_CHK.sh echo "input Chr" read C echo "input Start" read S echo "inp ...
- 性能工具---JConsole基于JMX的可视化监视、管理工具
与visualvm类似: JConsole: (Java Monitoring and Management Console),一种基于JMX的可视化监视.管理工具 VisualVM:(All-in- ...
- for in循环的坑
num本来数个数组,但是for in把数组原型上的也遍历(偶尔会)记录一下坑,数组还是for循环,for in还是用在对象上好
- C语言的导数和积分
用C进行导数和积分的运算 进行求导 设一个dx,利用f(x)-f(x-dx)/dx或f(x)-f(x+dx)/dx进行计算. float qd(float x) { float dx=0.01,y; ...
- Codeforces Round #803 (Div. 2) A-D 刚vp完还没补题
Codeforces Round #803 (Div. 2) 2022/7/24 上午VP 传送门:https://codeforces.com/contest/1698 A. XOR Mixup 随 ...
- MQ(为什么要使用MQ)
为什么使用MQ? 个人认为主要由几下几点: 1.在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达数据库,直接导致无数的行锁表锁,甚至最 ...
- 把OSC_IN/OSC_OUT引脚作为GPIO端口PD0/PD1
外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现.这个重映射只适用于36. 48和64脚的封装(100脚和 ...
- 远程云服务器上docker安装redis的过程
首先明确一点,云服务环境你已经安装好了docker 1.进入docker hub官网查看你所需要的redis的版本信息 https://registry.hub.docker.com/