常见问题:MySQL/事务隔离
数据库并行产生的问题
- A事务撤销时,将B事务更改的数据撤销。
- A事务提交时,将B事务更改的同行数据覆盖。
- 脏读:A事务读取到了B事务未提交的数据。
- 不可重复读:A事务中同查询语句不幂等,读到已更新数据。
- 幻读:A事物中同查询语句不幂等,读到新插入数据。
数据库事务隔离级别
- 串行化(Serializable):一个事务执行过程中完全看不到其他事务,但如果其他事务在操作,只能停等;可避免以上五个问题。
- 可重复读(Repeated Read, RR):一个事务可以看到其他事务已提交的新插入记录,但不能看到其他事务对已有行的更新记录;允许幻读。
- 读已提交数据(Read Committed, RC):一个事务可以看到其他事务已提交的记录,包括插入和更新;允许幻读和不可重复读。
- 读未提交(Read Uncommited):一个事务可以看到其他事务未提交的数据;仅能避免A事务撤销影响B事务。
InnoDB中的事务实现
MySQL的引擎是innoDB时,使用的默认隔离级别为,可重复读(RR级);大部分数据库使用的默认隔离级别为读已提交(RC级)。
实现RC级的事务时,仅需要采用行锁。InnoDB的行锁采用乐观锁的形式实现事务,InnoDB在每行数据后加入两个字段:创建版本号,删除版本号,在事务为默认的RR级以及RC级时,InnoDB事务隔离实现如下:
- select 读取版本号<=当前事务版本号,删除版本号为空或大于当前事务版本号。
- insert 保存当前事务版本号为行的创建版本号。
- delete 保存档前事务版本号为行的删除版本号。
- update 插入一条新的记录,保存当前事务版本号为行的创建版本号,同时保存当前事务版本号到原来的行。
需要注意的是,基于上述原理,mysql事务级别为可重复读时,select操作的结果不会有幻读记录,实际上,这是因为mysql的select是一种“快照读”,而非“当前读”。因此,事务为RR级和RC级时,mysql的select是不需要加锁的,但一旦涉及到insert/update/delete,则需要当前读,就需要加锁。
MySQL事务使用了Next-Key锁,Next-Key锁是行锁和间隙锁的合并。行锁负责给操作行加锁,在RC级中,使用行锁已经足够。而间隙锁,则基于数据作为索引结构的B+树,将数据所在块的邻接块一同加锁,因此可能会锁住不必要的区间,如果不使用索引,则会给全表加锁。
需要注意的是级别是串行的话,即便是select操作也是加锁的。
参考文献
常见问题:MySQL/事务隔离的更多相关文章
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 查询mysql事务隔离级别
查询mysql事务隔离级别 查询mysql事务隔离级别 分类: DB2011-11-26 13:12 2517人阅读 评论(0) 收藏 举报 mysqlsessionjava 1.查看当前会话隔离 ...
- MySQL事务隔离级别测试实例
https://www.cnblogs.com/huanongying/p/7021555.html MySQL事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommit ...
- Mysql事务-隔离级别
MYSQL事务-隔离级别 事务是什么? 事务简言之就是一组SQL执行要么全部成功,要么全部失败.MYSQL的事务在存储引擎层实现. 事务都有ACID特性: 原子性(Atomicity):一个事务必须被 ...
- MySQL事务隔离级别 解决并发问题
MySQL事务隔离级别 1. 脏读: 骗钱的手段, 两个窗口或线程分别调用数据库转账表,转账后未提交,对方查看到账后,rollback,实际钱没转. 演示方法: mysql默认的事务隔离级别为repe ...
- mysql事务隔离级别、脏读、幻读
Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...
- mysql事务隔离级别与设置
mysql数据库,当且仅当引擎是InnoDB,才支持事务: 1.隔离级别 事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repe ...
- MySQL事务隔离级别(二)
搞清楚MySQL事务隔离级别 首先创建一个表 account.创建表的过程略过(由于 InnoDB 存储引擎支持事务,所以将表的存储引擎设置为 InnoDB).表的结构如下: 为了说明问题,我们打开两 ...
- MySQL事务隔离级别(一)
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
随机推荐
- pytorch imagenet测试代码
image_test.py import argparse import numpy as np import sys import os import csv from imagenet_test_ ...
- LeetCode算法题-链表类
1.将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. (可以参照第2的merge2List实现) 示例: 输入:1->2->4, 1->3 ...
- 从海量文本中统计出前k个频率最高的词语
现有如下题目:有一个海量文本,存储的是汉语词语,要求从中找出前K个出现频率最高的词语,写出最优算法,兼顾时间和空间复杂度. 思路分析:熟悉搜索引擎的程序员,应该不是难题.用传统的HashMap是无法解 ...
- ubuntu安装mysql自动输入密码随笔记录
sudo debconf-set-selections <<< 'mysql-server mysql-server/root_password password your_pass ...
- Tkinter 之磁盘搜索工具实战
一.效果图 二.代码 miniSearch.py from tkinter import * from tkinter import ttk, messagebox, filedialog from ...
- Redis哨兵参数
一.常用命令 sentinel的基本状态信息INFO 列出所有被监视的主服务器,以及这些主服务器的当前状态SENTINEL masters 列出指定主redis的从节点状态情况SENTINEL sla ...
- Apollo的基本使用及常见问题
1. 创建项目 在创建项目页面中填写相关项目信息,最后点击提交即可创建项目. 注意:应用Id必须唯一并且与客户配置的app.id一致. 2. 发布 进入对应项目可通过文本(批量)或者表格模式添加配置, ...
- vue-router 利用url传递参数
vue-router 利用url传递参数 :冒号的形式传递参数 在路由配置文件里以:冒号的形式传递参数,这就是对参数的绑定. 1. 在配置文件里以冒号的形式设置参数.我们在/src/router/i ...
- Springmvc & Report: FineReport vs BIRT vs Jasperreport
Springmvc与jasperreport结合生成报表的一种方法 - OneThin的个人空间 - OSCHINAhttps://my.oschina.net/onethin/blog/14360 ...
- c++ 标准 字符串转换为时间 时间大小比较 判断有效期 简洁办法
c# php delphi java 等各种语言 对字符串转换为日期 然后与当前日期进行比较 是非常容易的 因为有现成的函数可用 标准 c++ 硬是找不到 合适的代码可用 于是 百度了很多 没百出个结 ...