mysql-innoDB-事务
事务的隔离级别和锁机制:
READ UNCOMMITTED(未提交读)
在这个级别,事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据。(不加锁或只加共享锁)
READ COMMITTED(提交读)
一个事务开始时,只能“看见”已经提交的事务所做的修改。也就是一个事务从开始直到提交前,所做的任何修改对其他事务都是不可见的。(对行记录加排它锁)
REPEATABLE READ(可重复读) MySQL数据库默认的隔离级别
一个事务在执行过程中可以看到其他事务已经提交的新增(删除)的数据,但是不能看到其他事务对已有记录的更新。可重复读解决了“脏读”的问题,但是有“幻读”的问题,
InnoDB和XtraDB存储引擎通过MVCC解决了幻读的问题。(对符合条件的记录加区间锁)
SERIALIZABLE(可串行化) ORACLE数据库默认的隔离级别
一个事务在执行过程中完全看不到其他事务对数据库所做的更新,当两个事务同事操作数据库中相同的数据时,如果第一个事务已经在访问该数据,第二个事务只能停下
来等待,必须等到第一个事务执行完毕后才能够进行。最高的隔离级别,SERIALIZABLE会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁竞争的问题。(对整个表加锁)
1. MySQL可以通过执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别。新的隔离级别会在下一个事务开始的时候生效。
2. 也可以改变当前回话的隔离级别:SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
3. MySQL服务器层不管理事务,事务是由下层存储引擎实现的。
事务设置的相关命令:
1、查看当前会话的隔离级别:select @@tx_isolation;
2、查看系统当前隔离级别:select @@global.tx_isolation;
3、设置当前会话隔离级别:set session transaction isolation level repeatable read;
4、设置当前系统隔离级别:set global transaction isolation level repeatable read;
5、查看和设置mysql自动提交:show VARIABLES like 'autocommit'; set autocommit=off;
脏读:
允许事务B读到了事务A未提交的数据,可能就造成了脏读,脏读的本质就是无效的数据,只有当事务A回滚,那么事务B读到的数据才为脏数据,所以这里只是可能造成脏读。如果事务A不回滚,事务B读到的数据就不为脏数据,也就是有效的数据。
不可重复读:
不可重复读是指在一个事务范围中2次或者多次查询同一数据M返回了不同的数据,例如:事务B读取某一数据,事务A修改了该数据M并且提交,事务B又读取该数据M(可能是再次校验),在同一个事务B中,读取同一个数据M的结果集不同,这个很蛋疼
幻读:
当用户读取某一个范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现会有新的“幻影行”,例如:事务B读某一个数据M,事务A对数据M增加了一行并提交,事务B又读数据M,发生多出了一行造成的结果不一致(如果行数相同,则是不可重复读)。
丢失更新:
事务A和事务B,同时获得相同数据,然后在各自的事务中修改数据M,事务A先提交事务,数据M假如为M+,事务B后提交事务,数据M变成了M++,最终结果变成M++,覆盖了事务A的更新。
不可重复读和幻读的区别:
1、简单来说,不可重复读是由于数据修改引起的,幻读是因为数据增加或者删除引起的。
2、不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
3、所谓幻读,是指事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
隐式锁定和显式锁定:
1.InnoDB采用的是两阶段锁定协议(two-phase locking protocol)。在事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT和ROLLBAK的时候才会释放,并且所有的锁是在同一时刻被释放。
2. LOCK TABLES和事务之间相互影响的话,情况会变得非常复杂,所以除非事务中禁用了AUTOCOMMIT,可以使用LOCK TABLES之外,其他任何时候都不要显示的执行LOCK TABLES,不管使用的是什么存储引擎。
死锁:
两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源也可能会产生死锁
例如:
--事务1
START TRANSACTION;
UPDATE price SET close=45.5 WHERE stock_id=4 AND date='2017-10-11';
UPDATE price SET close=19.8 WHERE stock_id=3 AND date='2017-10-12';
COMMIT; --事务2
START TRANSACTION;
UPDATE price SET high=20.12 WHERE stock_id=3 AND data='2017-10-12';
UPDATE price SET high=47.20 WHERE stock_id=4 AND data='2017-10-11';
COMMIT;
如果凑巧,两个事务都执行了第一条UPDATE语句,更新了一行数据,同时也锁定了该行数据,接着每个事务都尝试去执行第二条UPDATE语句,却发现改行已经被对方锁定,然后两个事务都等待对方释放锁,同时有持有对方需要的锁,则陷入死循环。除非有外部因素接入才可能接触死锁。InnoDB目前处理死锁的方法时,经持有最少行级排他锁的事务进行回滚
InnoDB-MVCC多版本并发控制
事物和索引的关系?
参考:
【1】《高性能MySQL》(第三版), Baron Schwartz等 著,宁海元等 译,电子工业出版社 ,2013
【2】 博客,https://segmentfault.com/a/1190000004469395#articleHeader6
【3】微信,https://mp.weixin.qq.com/s/LlgYXE7oswDJEt5wJhyAwA
mysql-innoDB-事务的更多相关文章
- 搞懂MySQL InnoDB事务ACID实现原理
前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...
- Mysql InnoDB事务
http://www.cnblogs.com/benshan/archive/2013/01/19/2867244.html 事务的四个特性 1.原子性(atomicity)原子性是指整个数据库事务是 ...
- MySql - InnoDB - 事务 , Php版
(出处:http://www.cnblogs.com/linguanh/) 1,前序 由于要重构APP(社交类) 服务端接口的部分代码,故接触到了 innoDB,以及事务这个词,下面主要是以例子的形式 ...
- MySQL InnoDB 事务实现过程相关内容的概述
MySQL事务的实现涉及到redo和undo以及purge,redo是保证事务的原子性和持久性:undo是保证事务的一致性(一致性读和多版本并发控制):purge清理undo表空间背景知识,对于Inn ...
- 一文快速搞懂MySQL InnoDB事务ACID实现原理(转)
这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...
- MySQL——InnoDB事务
事务:全部成功 或 全部失败! ------------------------------------------------------------------------------------ ...
- mysql innodb事务的ACID及其实现的保证机制
MySQL事务的ACID,一致性是最终目的.保证一致性的措施有:A原子性:靠undo log来保证(异常或执行失败后进行回滚).D持久性:靠redo log来保证(保证当MySQL宕机或停电后,可以通 ...
- MySQL InnoDB四个事务级别 与 脏读、不反复读、幻读
MySQL InnoDB事务隔离级别脏读.可反复读.幻读 希望通过本文.能够加深读者对ySQL InnoDB的四个事务隔离级别.以及脏读.不反复读.幻读的理解. MySQL InnoDB事务的隔离级别 ...
- MySQL InnoDB MVCC
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...
- MySQL InnoDB 实现高并发原理
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...
随机推荐
- TurnipBit之DIY无线遥控智能小车
一.准备工作 TurnipBit 开发板 2块 TurnipBit 扩展板 1块 数据线 1条 智能小车器件 1套 电机驱动模块(L298N) 1个 在线可视化编程 点击进入 二.思路设计 2 ...
- TurnipBit-MicroPython开发板:跟孩子一起DIY跳动的心
天是越来越热了,小心脏也是越跳越快啊,为了表达现在激动的心情,必须做个激动的心开始跳动.紧接着就开始带领大家做个激动的心. 首先说说要借助的平台,这次仅仅需要借助一块TurnipBit开发板. Tur ...
- docker:(4)利用WebHook实现持续集成
研发小伙伴可能对下列操作步骤会深有体会 写代码-->提交代码-->打包-->发布 在项目调试测试阶段,可能经常需要重复上面的步骤,以便将最新代码部署到特定环境供测试人员或其他人员使用 ...
- CSS基础之盒子模型及浮动布局
盒模型 谈到盒模型,有经验的小伙伴一定滚瓜烂熟,无非就是 内容(content).填充(padding).边框(border).边界(margin): 这些属性我们可以把它转移到我们日常生活中的盒子( ...
- CTF---Web入门第十四题 忘记密码了
忘记密码了分值:20 来源: Justatest 难度:中 参与人数:7706人 Get Flag:2232人 答题人数:2386人 解题通过率:94% 找回密码 格式:SimCTF{ } 解题链接: ...
- BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】
2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 604 Solved: 260[Submit][Status ...
- 二叉排序树BST+求树深度算法
#include "stdio.h" #include "malloc.h" typedef struct node { int key; struct nod ...
- Function方法和属性图
- 初步了解关于js跨域问题-jsonp
js跨域问题是指在js在不同的域中进行数据传输或者数据通信,比如通过ajax向不同的域请求数据(说到ajax,不可避免的就会遇到两个问题:一是ajax是如何传递数据的?二是ajax是如何实现跨域的?) ...
- oracle创建触发器及作用举例
--创建触发器及作用举例 create or replace trigger tri before delete on emp --在删除emp表数据之前需要做的事根据自己的业务去写,before是在 ...