一文解决MySQL事务并发问题和事务隔离级别及MVCC原理

一文搞懂MySQL的MVCC原理及如何解决幻读 在之前的文章中详细的介绍了 MySQL 中的事务和隔离级别,在并发访问数据库造成的问题(脏读、不可重复读、幻读),而 MVCC 就是在尽量减少锁使用的情况下高效避免这些问题。 阅读详情

事务并发产生的一致性问题

脏写

如果一个事务修改了另一个未提交事务的修改过的数据,则称发生了脏写现象。

举个例子:
假设数据库中有一个数据项为x=2;
事务A修改了x=1;此时事务A并没有提交,事务B此时也来修改数据项x=0;此时事务A,B提交
事务B修改了事务A未提交修改过的数据,所以发生了脏写的现象

脏读

如果一个事务读取了另一个事务未提交的数据,则称发生了脏读现象
在这里插入图片描述

不可重复读

如果一个事务A读取了x的值,然后事务B又修改了x的值并且提交,事务A再次读取x的值时,则会与第一次x的值不同,则称发生了不可重复读(也就是两次读的结果不一样)。
注意:如果事务发生了update更新值,delete删除记录,则可以把这种现象叫做不可重复读
在这里插入图片描述

幻读

当一个事务A读取符合搜索条件的记录数为x,此时另一个事务B往符合条件里插入了一条行数据并提交,此时事务A再去读符合条件的记录数时,则跟原来的不一样,则称发生了幻读。
注意:如果事务发生了insert插入符合条件的记录,或则是update修改了记录的键值导致插入符合记录数里,则可以把这种现象叫做幻读
在这里插入图片描述

SQL标准对这里的不可重复读和幻读有点描述不清,我们一般认为:

  • 幻读强调的是在后读取到了之前没有读取到的数据,这个没有读取到的数据,可能是insert或则update插入的
  • 不可重复读的话,则是updata和delete

SQL标准中的四种隔离级别

隔离级别脏读不可重复读幻读
READ UNCOMMITTED可能可能可能
READ COMMITTED不可能可能可能
REPETABLE READ不可能不可能可能
SERIALIZABLE不可能不可能不可能

MySQL支持的四种隔离级别

oralce支持两种隔离级别:read committed和serializable
mysql支持虽然支持四种隔离级别,但是mysql的repeatable read隔离级别不允许幻读

MVCC原理

实现MVCC关键:隐藏字段,undo log,ReadView

版本链

对于聚簇索引记录来讲,每个行格式都包含了两个必须的隐藏列

  • row_id不是必须的,只有在没有主键或者没有非空的unique字段时,才会有row_id;
  • trx_id事务id是必须有的;一个事务在对记录进行修改后,都会将该事务的id写入记录的trx_id中
  • roll_point回滚指针,指向上一个版本的记录,相当于一个指针
    在这里插入图片描述

这里insert log日志在只在事务回滚时起作用,事务提交后该日志文件就被系统回收了(可能是被重用或则释放了)。
虽然insert undo日志被真正回收了,但是回滚指针的值并没有清除,如果roll_point第一个字节是1的话,表示它是一个insert undo日志

现在假设我们的数据库中发生了如下事务:
在这里插入图片描述
那么对应的版本链则如下图:
在这里插入图片描述
每次事务更新该行时,都会将事务id写入trx_id中。将旧记录写入undo 日志中,每条undo日志中也会有roll_point属性,其他字段只包含索引列和更新的列(insert的undo日志中没有该属性,因为insert没有旧版本)。这些undo日志通过roll_point形成一个版本链。

我们后面会通过该记录的版本链来控制并发事务可以访问到的记录,我们把这种机制叫做MVCC多版本并发控制

注意:这里undo日志并不是全部字段都有,只会包含一些索引列和被更新的字段
比如我们上面的class字段,undo日志里是没有记录这个字段的,因为它并没有被更新,如果该版本没有这个字段,说明它是和上一个版本字段值相同

ReadView

使用uncommitted read隔离级别时,由于可以读到未提交的值,所以直接读取最新版本的值即可。使用可串行化隔离级别时,使用加锁来访问记录。

对于读已提交和不可重复读这两个隔离级别时,由于不能读取未提交事务的值,所以我们必须控制它可以读取的记录,故而提出了ReadView的概念

ReadView主要包含以下四个重要的内容:
m_ids:在生成readview时,当前活跃的事务id
min_trx_id:当前活跃事务中,id最小的值
max_trx_id:表示生成该readview时,分配给下一个事务的事务id

注意:max_trx_id并不是m_ids中的最大值,事务id是递增分配的。

  • 比如,现在有id为1, 2,3这三个事务,之后id为3的事务提交了。
    那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4

creat_trx_id:创建该readview的事务id

只有执行insert,update,delete操作时,才会给它分配事务唯一id,执行select操作不会给它分配事务id,默认都为0

有了这个readview和版本链后,我们就可以根据这些判断该记录是否可见了:

  • 如果记录中的trx_id和readview中的create_trx_id值相同时,则说明这个记录是该事务修改的,则表示可以读取
  • 如果记录中的trx_id小于readview中的min_trx_id值,则说明生成该readview时,修改该记录的事务已经提交,可以被读取
  • 如果记录中的trx_id大于readview中max_trx_id值,则说明生成该readview时,修改该记录的事务还没有创建出来,说明它是不可被读取的
  • 如果记录汇总的trx_id小于readview的最大值事务id,大于readview的最小值事务id。则查看它是否则活跃事务列表里,如果在的话,说明生成该readview时,该事务还没有被提交,则不可读取该记录。否则说明已提交,可以读取

如果该版本对该事务不可见,则顺着版本链往下找,直到记录可见。如果到最后都没有可见的记录,则说明该记录不可见,不能包含到结果集中

读已提交和可重复读:最大的区别在于生成readview的时机不一样
因为读已提交是不能解决不可重复读的,所以一个事务中两次读取的记录会不一样,所以每执行一个select操作都会生成一个readview。

而可重复读在一个事务中两次读取的记录必须是一样的,所以在该隔离级别下只有第一次select操作会生成一个readview,后续的select操作会复用这个readview

二级索引与MVCC

前面我们讲的行记录中都是包含trx_id和roll_point隐藏列的,那么二级索引是没有隐藏列的,那么我们通过二级索引查找记录时,如何判断它的可见性呢???

比如下面这个事务
begin;
select name from user where name=‘刘备’;

此时我们的查询优化器决定了要到二级索引中查找name为‘刘备’的记录,那么该如何判断该记录可见呢??可分为以下两步:

  1. 二级索引页面的Page Header部分有一个名为PAGE_MAX_TRX_ID的属性,每次对该页面做增删改操作时,判断该事务的id是否大于PAGE_MAX_TRX_ID的值,如果大于,则把PAGE_MAX_TRX_ID的值更新为事务id值。那么我们的事务在select查询时,如果readview中的最小事务id大于PAGE_MAX_TRX_ID的值,则说明最后修改该页面的事务早就提交了,此页面全部可以访问。否则的话,就需要进行第二部操作,回表
  2. 通过name找到聚簇索引的记录,然后通过前面的方式找到可见的第一个版本,如果该版本的name符合‘刘备’,则把该记录返回。否则查找下一个记录(不是查找下一个版本哦)

补充:关于purge

我们知道在insert操作时,事务提交后就可以释放掉了,而进行delete操作和更新键值的updata操作时,并不会立即删除记录,而是给该记录打一个删除标记,其主要就是为了给MVCC服务。那么总不可能一直不删除记录吧!!那存储空间不得爆了!!

处理这些记录的操作我们叫做purge操作,主要的问题就是什么时候处理???
简单一句话:当系统中最早产生的readview不再访问他们了,那么就可以清理了。那么什么时候才表示肯定不再访问它们了呢?只要在生成readview时,保证某个事务已经提交,就说明该readview不会访问该事务的updata undo日志了
详见《MySQL是怎样运行的》P398

MySQL的事务隔离级别、锁机制、MVCC的原理 MVCC(Multi-Version Concurrency Control,多版本并发控制)是 MySQL中 InnoDB 引擎实现高并发访问的核心机制,通过数据多版本化解决读写冲突,实现非阻塞读取。MVCC 相对于为每个修改保存一个版本,版本与事务时间戳关系,读操作只读该事务开始前的数据库的快照。它是通过数据库记录中的隐式字段 Undo Log、Read View 实现的。MVCC 可以很好地平衡好性能和数据安全性之间的关系,在不加锁的情况下避免多事务竞争带来的不可重复读、脏读、幻读的问题。 阅读详情

相关推荐

京东面试:MySQL MVCC是如何实现的?如何通过MVCC实现读已提交、可重复读隔离级别的?

MVCC机制的全称为,即多版本并发控制。MVCC主要是为了提升数据库并发性能而设计的,其中采用更好的方式处理了读-写并发冲突,做到即使有读写冲突时,可以实现并发执行,从而提升并发能力,确保了任何时刻的读操作都是非阻塞的。在众多的MySQL开源存储引擎中,几乎只有InnoDB实现了MVCC机制,其他的存储引擎如:MyISAM、memory等存储引擎中并未实现MVCC。

架构师尼恩 2221

MySQL事务的并发问题和隔离级别

一、数据库的并发问题 对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。 脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有提交的字段,之后,T2回滚,T1读取的就是临时无效的数据。 不可重复度:对于两个事务T1、T2,T1读取了表中的一个字段,然后T2更新了该字段,T1再一次读取同一字段,值就不同了。 幻读:对于两个事务T1、T2,T1读取了表中的一个字段,然后T2在该字段插入了几行数据,T1再一次读取同一字段,就..

qq_43641035的博客 618

MySQL事务隔离级别的实现原理——LBCC + MVCC (InnoDB)

由于Mysql 默认的隔离级别是Repeatable Read、所以本篇文章的部分结论是基于RR隔离级别得出 事务具有四大特性 ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 关于原子性、一致性、和持久性是如何保证的,在前面文章中已经介绍:传送门 本文只介绍事务隔离级别相关的特性 违反事务隔离级别的几个特征 首先需要了解一下违反事物隔离级别的几个特征: 脏读 当前事务中读取到了其它没有提交的事务修改的数据———读.

眉头的骰 1871

MySQL学习笔记 002:InnoDB数据页结构

MySQL学习笔记 002:InnoDB数据页结构1 数据页结构2 User Record2.1 heap_no2.2 next_record2.3 deleted_flag2.4 record_type3 Page Directory4 Page Header5 File header & File trailer5.1 File header5.2 File trailer 1 数据页结构 名称 大小 (Byte) 描述 File Header 38 文件头部,存放页通用信息

yangfan16120029的博客 268

华为2022数字芯片笔试题

单选 1、ASIC开发流程中,如下环节的先后顺序是? A. RTL-> Synthesis->P&R B. Synthesis->P&R->RTL C. Synthesis->RTL->P&R D.RTL->P&R->Synthesis 2、o10换算成十进制是多少? A. 8 B.16 C.10 D.2 3、reg [7:0] mem [1:256];initial $readmemh("me..

weixin_44072819的博客 1万+

Ribo-seq数据解析:从翻译效率计算到动态可视化分析

本文系统介绍了Ribo-seq(核糖体印迹测序)数据分析全流程,从核心的P-site定位、翻译效率计算,到差异翻译分析和动态可视化。重点阐述了如何利用Ribo-seq高分辨率数据揭示基因表达在翻译层面的精细调控,并提供了从数据处理到生物学解读的实用工具与避坑指南。

weixin_28559803的博客 421

MySQL 事务

对于Read Committed和Repeatable Read隔离级别来说,都需要读取已经提交的事务所修改的记录,也就是说如果版本链中某个版本的修改没有提交,那么该版本的记录时不能被读取的。如果某个版本的数据对当前事务不可见的话,那就顺着版本链找到下一个版本的数据,继续按照上边的步骤判断可见性,依此类推,直到版本链中的最后一个版本。串行化的情况下,对于同一行事务,写会加写锁,读会加读锁。与不可重复读的区别是:在幻读中,已经读取的数据不会改变,只是与以前相比,会有更多的数据满足查询条件。

name_sakura的博客 454

fMRI数据处理:从DICOM到NIFTI(上)

哈喽,这里是系列fMRI数据处理文章专栏。包括从核磁拷贝完DICOM格式的文件,到整理数据,检查数据,数据预处理,后续分析等等内容。如果你是一个初学者,特别是心理学或者是刚踏入认知神经科学的小白,那么这个专栏可以帮助你从头到尾完成数据处理直到结果的可视化。如果你已经进入了认知神经科学领域,这里面的内容可能过于细致,并且找不到你想要的答案,不过可以在帖子下留言评论,欢迎大家提供宝贵的意见!如果是医学相关,可能这些内不太准确或专业,谨慎参考!

weixin_44933894的博客 2482

MySQL 不同的自增 id 达到上限以后的行为 -MySQL实战

InnoDB 维护了一个全局的 dict_sys.row_id 值,所有无主键的 InnoDB 表,每插入一行数据,都将当前的 dict_sys.row_id 值作为要插入数据的 row_id,然后把 dict_sys.row_id 的值加 1。但是,trx_id 跟 row_id 的逻辑类似,定义长度也是 8 个字节。InnoDB 内部维护了一个 max_trx_id 全局变量,每次需要申请一个新的 trx_id 时,就获得 max_trx_id 的当前值,然后并将 max_trx_id 加 1。

jnrjian的博客 921

量化投资之工具篇一:Backtrader从入门到精通(1)-手把手教你零基础实现一个策略案例

Backtrader是重要的量化框架,本文记录学习该框架的笔记,内容主要基于Backtrader的网站指导文档。虽然该框架目前用于量化投资领域,但是可以作为数据处理的基本架构,进行改造后用于各种数据的处理,尤其适用于对原始数据处理完成后应用一定的策略进行预测以及可视化处理。 1、简介 Backtrader的特点,就是两点: 1、易于使用; 2、参见第1条。 那么如何使用Backtrader呢?比把大象装进冰箱复杂点,一共4步: 创建一个Cerebro引擎: 加入一个Strategy...

仓鼠王的博客 5万+

1-Wire 单总线硬件结构及软件时序分析(实测波形+C代码分析)

1根线就可以通信,是不是很神奇?因为其节省I/O口的优点而被广泛使用!

记得诚 1万+

mysql中事务id,有啥用?

trx_id是Innodb中标识一个事务的id,是一个6字节长度的整数。这个id的值来源于是Innodb维护的max_trx_id,当需要申请一个新的trx_id值时,就获取max_trx_id的最新值,然后将max_trx_id值加1. 注:max_trx_id和row_id类似,存储时使用数据类型是8字节,但是只使用其后6字节数据,当max_trx_id超过了2的48次方时,max_trx_id的值,有会从0开始循环。 对于trx_id的介绍,我们分以下4个小结。 1.trx_id获取的规则,什么时候获

weixin_45701550的博客 6105

基于半经验模型的熔断器燃弧过程计算与分析

本文针对1200V/1250A熔断器建立电弧燃烧半经验模型,通过ANSYS计算弧前时间,结合熔体烧蚀、石英砂烧蚀等物理过程简化建模。模型引入电导率随温度变化函数,利用Matlab拟合实验数据确定参数。分析表明:熔体宽度和节距增加会提高弧压峰值并缩短过零时间;总长固定时,断口数和节距影响较小。弧压峰值需控制在额定电压3倍内,过零时间需满足安全裕度。通过Python代码复现了电弧电导率模型、能量平衡方程及弧压计算,验证了熔体结构尺寸对电弧特性的影响规律。

huanghm88的专栏 258

MySQL-事务(下)-MySQL事务隔离级别与MVCC

MySQL事务隔离级别与MVCC机制解析:文章深入剖析了MySQL四种事务隔离级别(读未提交、读已提交、可重复读、可串行化)及其解决的数据一致性问题,重点讲解了默认的可重复读级别。详细阐述了MVCC工作原理,包括隐藏字段、undo日志和ReadView三个关键概念,通过示例演示了版本链形成过程。最后对比了RR和RC隔离级别的本质区别——ReadView生成时机的不同,解释了RR如何避免不可重复读问题。这些核心机制共同保障了数据库在并发环境下的数据一致性和高性能。

nplplus的博客 6232

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

R语言coxph函数对加权数据集进行竞争风险模型拟合、regplot包的regplot函数可视化竞争风险回归模型的列线图nomogram、计算特定病例的事件概率(控制了竞争风险的累计事件概率)

statistics+insight+vista+power 358

【FISCO-BCOS】 八、ubuntu配置Java环境

ubuntu配置Java环境需根据自己的java版本号进行细节修改,本文以jdk11.0.18版本为例。ps:通过此法还可以查看java安装路径,但必须是环境配置成功的情况下才能使用。二、添加Java环境路径。四、检查java环境设置。

naihe_fish的博客 4309

MySQL事务并发问题和MVCC机制

在MySQL的InnoDB存储引擎下 RC和RR 事务隔离级别都是基于这个MVCC(多版本并发控制)进行并发事务的控制的然后这个MVCC是基于这个"数据版本"对并发事务进行访问的。

qq_66627105的博客 1641

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

MySQL事务隔离级别和MVCC (绝对看得懂)

来自一本MySQL小册子,讲得很好,值得收藏! 为了故事的顺利发展,我们需要创建一个表: CREATE TABLE t ( id INT PRIMARY KEY, c VARCHAR(100) ) Engine=InnoDB CHARSET=utf8; 然后向这个表里插入一条数据: INSERT INTO t VALUES(1, '刘备'); ...

风的记忆 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL事务隔离级别的实现原理MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制,是并发读写场景下,数据库层面提供的一种解决方案。读读当多个事务同时进行读取操作时,它们之间不存在资源竞争,不会产生任何问题。因为读取操作并不会对数据进行修改。读写在这种场景下,一个事务进行读取操作,另一个事务进行写入操作,可能会引发一系列数据一致性问题,如脏读(读取到其他事务未提交的数据)、不可重复读(在同一事务中多次读取同一数据结果不同)以及幻读(事务执行过程中出现新的符合条件的数据)。

weixin_45593273的博客 3341

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

mysql中MVCC多版本并发控制原理的详解

今天我们分享mysql中MVCC多版本并发控制原理的详解 一、MVCC定义 1、MVCC简介 MVCC,全称Multi-Version Concurrency Control,即多版本井发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。 MVCC在MysQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突。做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。 2、当前读 像select lock in sha.

nandao158的博客 1万+

MVCC 原理分析、MySQL是如何解决幻读的

为什么使用MVCC,MVCC原理分析,当前读、快照读,TRX_ID、ROLL_PTR,undo log、版本链,Read View读视图、版本链数据的访问规则,MySQL如何解决幻读,记录锁、间隙锁、next-key锁

qq_44700578的博客 3618

MySQL事务隔离级别

一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)。一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务用来管理 insert,update,delete 语句。

weixin_43844718的博客 7009

一文搞懂MySQL的MVCC原理及如何解决幻读(事务隔离级别)

在之前的文章中详细的介绍了MySQL 中的事务和隔离级别,在并发访问数据库造成的问题(脏读、不可重复读、幻读),而 MVCC 就是在尽量减少锁使用的情况下高效避免这些问题。隔离级别脏读不可重复读幻读READ UNCOMMITTED:未提交读可能发生可能发生可能发生READ COMMITTED:已提交读解决可能发生可能发生REPEATABLE READ:可重复读解决解决可能发生SERIALIZABLE:可串行化解决解决解决。

HD243608836的博客 3183

一文搞懂事务隔离级别、MVCC

ACID是衡量事务的四个特性原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)需要注意的是,在最开始的定义中,事务必须要满足这四个特性。但在许多地方的实际应用中,这四个特性并没有被完全实现,比如MySQL、Redis的事务就不支持原子性,所以后来这四个特性渐渐地变成了衡量事务的标准而不是事务的必须条件我们日常的select都是快照读;

Romantic丶的博客 1681

mysql事务 事务并发问题 隔离级别 以及原理

这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。MySQL中的锁可以分为全局锁和局部锁。表级锁:最简单的锁类型,它锁定整个表,防止其他事务对表进行修改。事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

weixin_64260010的博客 1291

【MySQL事务】事务的隔离级别

正在进行中且尚未提交。

2301_80224556的博客 2120
上一篇: 已经建立的TCP,收到SYN会发生什么?
下一篇: IP协议相关技术终极详解
small_engineer
博客等级 码龄7年 3191粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值