mysql事务模式怎么查_Mysql InnoDB中的查询事务模式与锁定select ..for update

在 InnoDB 的行锁中使用所谓的 next-key locking。这就意味着,除了索引记录外,InnoDB 还可以锁定该索引记录前部“间隙” ('gap') 以阻塞其它用户在索引记录前部的直接插入。next-key lock 意思是锁定一个索引记录以及该记录之前的间隙(gap)。gap lock 就是只锁定某些索引记录之前的间隙。

Consistent read

Consistent read 就是 InnoDB 使用它的多版本(multiversioning)方式提供给查询一个数据库在一个时间点的快照。查询将会检查那些在这个时间点之前提交的事务所做的改动,以及在时间点之后改变或未提交的事务? 与这个规则相例外的是查询将检查查询自身发出的事务所做的改变。

如果以默认的 REPEATABLE READ 隔离级,那么所有在同一事务中的 consistent reads 只读取同一个在事务中第一次读所确定的快照。你可以通过提交当前事务并发出一个新的查询以获得新的数据快照。

Consistent read 在 InnoDB 处理 SELECT 中的默认模式是 READ COMMITTED 和 REPEATABLE READ 隔离级。Consistent read 对其所访问的表不加任何锁定,因而其它任何用户均可以修改在 consistent read 被完成之前自由的修改这些表。

Locking reads

Consistent read (mysql默认) 未提交读,允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

方式:select .......

Consistent read 在某些情况下是不太方便的。 假设你希望在表 CHILD 中插入 一个新行,而这个子表已有一个父表 PARENT。

假设你使用 consistent read 了读取表 PARENT 并查看子表中对应记录。你真的能安全地在表 CHILD 中加入一个子行?不可能,因为在此期间可能有其它用户删除了表 PARENT 中的父行,而你并不知道它。

提交读(Read Committed)只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别

方式:  SELECT..... LOCK IN SHARE MODE;  //会产生死锁 共享访问锁   //一般

在共享模式下执行读取的意思就是读取最新的现有资料,并在所读取的行上设置一个共享模式的锁定。如果最新的数据属于其它用户仍未提交的事务,那将不得不等到这个事务被提交。共享模式的可以防止其它用户更新或删除我们当前所读取的行。当查询获得 Jones后,就可以安全地向子表 CHILD 中加入子行,然后提交事务。这个例子显示如何在应用程序代码中实现参照完整性。

另外一个例子: 在表 CHILD_CODES 有一个整型计数字段用于给在表 CHILD 中加入的每个子行赋于一个唯一的标识符。显而易见地,用一个 consistent read 来读取父表中的值并不是一个好的主意,因两个用户有可能会读取出同一个计数值,当以同一个标识符插入两个字行时将会产生一个重复键值(duplicate key)的错误。如果两个用户同时读取了计数器,当尝试更新计数器时,他们中的一个必将在死锁中结束,所以在读取时使用 LOCK IN SHARE MODE 也并不是一个好的解决办法。

可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读 (幻象读。多锁住一些没用的行 下面有详细)

SELECT ... FOR UPDATE        //安全最高

在这和情况下有两种方法来实现读取并增加计数器:(1) 首先更新计数器然后再读取它;(2) 首先以一个 FOR UPDATE 方式锁定后再读取,然后再增加它:

SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;

UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;

SELECT ... FOR UPDATE

将读取最新的现有数据,并在所读取的行上设置排它的锁定。

同样在 SQL UPDATE 所访问的行上也设置此锁定。

Next-key locking: avoiding the phantom problem 在 InnoDB 的行级锁定上使用一个称作 next-key locking 算法。在 InnoDB 在搜索或扫描表的索引时将进行行锁,它将在所访问到的索引上设置共享或排它的锁定。因而行锁是更加精确地而又称为索引记录锁定。 InnoDB 在索引记录上设置的锁同样会影响索引记录之前的“间隙(gap)”。如果一个用户对索引记录 R 加了一个共享或排它的锁定,那其它用户将不能在 R 之前立即插入新的记录。这种间隙锁定用于防止所谓的“phantom

problem”。假设需读取和锁定表 CHILD 中标识符大于 100 的子行,并更新所搜索到的记录中某些字段。

SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;  假设表 CHILD 中有一个索引字段 ID。我们的查询将从 ID 大于100的第一条记录开始扫描索引记录。 现在,假设加在索引记录上的锁定不能阻止在间隙处的插入,一个新的子记录将可能在事务处理中被插入到表中。

如果现在在事务中再次执行 SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;  在查询返回的记录集中将会有一个新的子记录。这与事务的隔离规则相违背的:一个事务必须能够顺串(run), 因而在事务处理中所读取的数据将不会发生改变。而新的 'phantom' 子记录将会打破这个隔离规则。

当 InnoDB 扫描索引时,它同样会锁定在索引中在结尾记录(the last record)之后的间隙。这仅仅在上例中会发生: InnoDB 设置的锁定将阻止任何 ID 大于 100 的插入。 在应用程序中可以通过一个 next-key locking 来实现一个唯一性(uniqueness)检查:如果以一个共享模式读取数据并没有发现与将要插入的数据存在重复值, 那么在读取过程中 next-key lock 将被设置在你的记录的后继者(successor)上,这将阻止其它用户在期间插入相同的记录,因而你可以安全地插入你的记录。

所以, next-key locking 可以允许你 'lock' 你的表中并不存在的记录。     InnoDB 中的隔离级详细描述:  READ UNCOMMITTED 这通常称为 'dirty read':non-locking SELECTs 的执行使我们不会看到一个记录的可能更早的版本;因而在这个隔离度下是非 'consistent' reads;另外,这级隔离的运作如同 READ COMMITTED。

READ COMMITTED 有些类似 Oracle 的隔离级。所有 SELECT ... FOR UPDATE 和 SELECT ... LOCK IN SHARE MODE 语句只锁定索引记录,而不锁定之前的间隙,因而允许在锁定的记录后自由地插入新记录。以一个唯一地搜索条件使用一个唯一索引(unique index)的 UPDATE 和 DELETE,仅仅只锁定所找到的索引记录,而不锁定该索引之前的间隙。但是在范围型的 UPDATE and DELETE 中,InnoDB 必须设置 next-key 或

gap locks 来阻塞其它用户对范围内的空隙插入。 自从为了 MySQL 进行复制(replication)与恢复(recovery)工作'phantom rows'必须被阻塞以来,这就是必须的了。Consistent reads 运作方式与 Oracle 有点类似: 每一个 consistent read,甚至是同一个事务中的,均设置并作用它自己的最新快照。

REPEATABLE READ 这是 InnoDB 默认的事务隔离级。. SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE, 和 DELETE ,这些以唯一条件搜索唯一索引的,只锁定所找到的索引记录,而不锁定该索引之前的间隙。否则这些操作将使用 next-key 锁定,以 next-key 和 gap locks 锁定找到的索引范围,并阻塞其它用户的新建插入。在 consistent reads 中,与前一个隔离级相比这是一个重要的差别:在这一级中,同一事务中所有的

consistent reads 均读取第一次读取时已确定的快照。这个约定就意味着如果在同一事务中发出几个无格式(plain)的 SELECTs ,这些 SELECTs 的相互关系是一致的。

SERIALIZABLE 这一级与上一级相似,只是无格式(plain)的 SELECTs 被隐含地转换为 SELECT ... LOCK IN SHARE MODE。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[jQuery] jQuery中如何将数组转化为json字符串,然后再转化回来?

[jQuery] jQuery中如何将数组转化为json字符串,然后再转化回来? var typeOf obj > Object.prototype.toString.call(obj); typeOf([1]); // "[object Array]" typeOf($([1])); // "[object Object]" $([1]).toArray();个人简…

.NET反射、委托技术与设计模式

转自:http://hi.baidu.com/nanashitou/blog/item/ad7346eed769ffffb2fb958a.html 1 反射技术与设计模式 反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、…

python之yield的一些应用

生成器 yield是用于生成器。生成器通俗的认为,在一个函数中,使用了yield来代替return的位置的函数,就是生成器。它不同于函数的使用方法是:函数使用return来进行返回值,每调用一次,返回一个新加工好的数据返…

本题要求实现一个用选择法对整数数组进行简单排序的函数。_通俗易懂讲 Python 算法:快速排序...

原文:https://stackabuse.com/quicksort-in-python/作者:Marcus Sanatan译者:老齐欢迎在 bilibili 搜索 freeCodeCamp 官方账号或者直接访问 https://space.bilibili.com/335505768 观看我们的技术视频介绍快速排序是一种流行的排序算法&…

[jQuery]JQuery一个对象可以同时绑定多个事件,这是如何实现的?

JQuery一个对象可以同时绑定多个事件,这是如何实现的? ①$(document).ready(function() {$("button").bind({click: function() {$("p").slideToggle()},mouseover: function() {$("body").css("background-color&q…

张娟娟(为奥运冠军名字作诗)

张娟娟(为奥运冠军名字作诗)——代腾飞 2008年8月18日 于成都张弓搭箭射靶心娟娟俊美胜古今娟弓即破他人梦百步穿杨改乾坤 转载于:https://www.cnblogs.com/daitengfei/archive/2008/08/25/1276023.html

IO_ADDRESS()的实现【转】

上面我们说了如何去在系统中自己实现一个设置系统寄存器的一个方法,上面归根到底要进行物理地址到虚拟地址的映射 现在我们就说说IO_ADDRESS()的实现 #define __REG32ALI(addr) (*((volatile unsigned long *)((addr) - ALI_REGS_PHYS_BASE ALI_REGS_V…

vscode标记_高效扩展工具让 VS Code 如虎添翼

Codelf 变量命名神器Star:10688https://github.com/unbug/codelf新建项目,变量,类,方法,接口都需要命名,一个好的命名可以一眼看出这个地方的功能,CodeIf 一键起名不再难,输入关键词…

[html] 如何实现标题栏闪烁、滚动的效果

[html] 如何实现标题栏闪烁、滚动的效果 定时器背景设置个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

各种数据库连接字符串

1、ACCESS数据库连接set conn Server.CreateObject("ADODB.Connection")conn.Open("driver{Microsoft Access Driver (*.mdb)};dbq" &_Server.MapPath("person.mdb"))set rs conn.Execute( "SELECT * FROM grade" )For I 0 to …

linux服务器情况

查看Linux 进程命令 ps -aux 或者ps -ef linux 进程很多 如果需要查找某一个进程可以使用 管道和grep命令 Linux下常用命令 grep 匹配字符 ps 查询Linux进程 1.查看服务器CPU飙升卡爆,最后发现是服务器在跑挖矿程序,CPU使用率奇高。在此总结…

[html] 页面导入样式时,使用link和@import有什么区别?

[html] 页面导入样式时,使用link和import有什么区别? 区别: 1.link是HTML标签,import是css提供的。 2.link引入的样式页面加载时同时加载,import引入的样式需等页面加载完成后再加载。 3.link没有兼容性问题&#xff…

CSS 有关Position = absolute (绝对定位 是相对于谁而言)

css中有绝对定位法&#xff0c;以前一直搞不懂绝对定位是相对于谁而言的绝对定位。 现在搞清楚了&#xff0c;不是相对于父元素&#xff0c;也不是相对于BODY。 而是相对于所属元素树中&#xff0c;相邻最近的那个显示标识了position属性的元素。 比如 Code<div id"a&q…

[html] 简述超链接target属性的取值和作用

[html] 简述超链接target属性的取值和作用 _self: 在当前窗口打开页面 _blank: 在新窗口打开页面 _top: 在整个框架打开页面不是很理解个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

mysql gui vim_vim(一): 小技巧

1) 如何yank字符然后再查找 ( / Ctrl - R 0 ) The most recently yanked text will be stored in the 0 and registers (if no register was explicitly specified e.g. by xy ). Then you can paste the text of any that register in the last line (eith1) 如何yank字符然后…

服务端和客户端

1.一般来说&#xff0c;客户端就是我们使用的电脑&#xff08;包括我们使用的浏览器IE,Firefox&#xff09;&#xff1b;服务器端就是存放网页与数据库数据的服务器。 2.你是客户&#xff0c;因为你在访问&#xff0c;你访问的是服务端。去吃饭&#xff0c;你到饭店&#xff0c…

mysql 判断质数_java之判断输入的数是否为素数

import java.util.Scanner;public class TestIsSushu {public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("输入正整数&#xff1a;");int i scan.nextInt();if(i<0) {System.out.println("输入错误&#…

LeetCode Smallest Range

数据范围是3500,3500也就是说n的平方是可以接受的。这里告诉你就是有序的,也就是在提醒你可能会是一个类似于二分的算法,所以的话其实基于这两个认识的话我们就可以利用一个枚举叫二分的算法来解决这道题。怎么做呢&#xff1f;就首先的话我们要枚举一端,一端的话我们可以把所有…

Oracle创建用户、表空间、导入导出、...命令

//创建临时表空间create temporary tablespace test_temp tempfile E:\oracle\product\10.2.0\oradata\testserver\test_temp01.dbf size 32m autoextend on next 32m maxsize 2048mextent management local;//创建数据表空间create tablespace test_dataloggingdatafile E:\or…

[html] 简述下html5的离线储存原理,同时说明如何使用?

[html] 简述下html5的离线储存原理&#xff0c;同时说明如何使用&#xff1f; 原理&#xff1a;HTML5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术)&#xff0c;通过这个文件上的解析清单离线存储资源&#xff0c;这些资源就会像cookie一样被存储了下来。…