深入理解MySQL中的事务【超详细配图版】

MySQL存储过程的实现及其高级特性的应用 内容概要:本文详细介绍了MySQL存储过程的各种功能和技术细节,包括变量的定义与赋值、传入与传出参数、条件语句(如if-then-else)、循环语句(如while和repeat)、游标的使用方法、函数的定义与使用以及事件调度器(Event)。同时,还包括了一些高阶特性和综合案例,如使用Python脚本与MySQL存储过程结合进行数据归档和清理。 适合人群:具有一定的数据库管理和维护经验的技术人员,特别是MySQL数据库开发者和管理员。 阅读详情

1 引言

想必参加过后台开发面试的伙伴们都知道,MySQL事务这玩意是各大面试官百问不厌的知识点,但是大家对于事务的了解到什么层面呢,仅仅停留在ACID上么,这篇文章将陪着大家一起深入MySQL中的事务。

2 事务的特性

引言中所提到的ACID正是事务的四个特性:分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

  • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  • 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

其中一致性不太好理解,一致性是说无论事务提交还是回滚,不会破坏数据的完整性。比如A给B转100元,如果成功了,A的账户必定会扣100元,而B的账户必定会增加100元;如果失败了,A和B的账户余额不会改变。A和B中的账户金额变动必然是一个完整的过程(不可能是A扣除了50,B增加了50这种情况),整个过程必须是一致的。

2.1 原子性

事务的原子性是指:一个事务中的多个操作都是不可分割的,只能是全部执行成功、或者全部执行失败。
MySQL事务的原子性是通过undo log来实现的。undo log是InnoDB存储引擎特有的。具体的实现机制是:将所有对数据的修改(增、删、改)都写入日志(undo log)。

undo log是逻辑日志,可以理解为:记录和事务操作相反的SQL语句,事务执行insert语句,undo log就记录delete语句。它以追加写的方式记录日志,不会覆盖之前的日志。除此之外undo log还用来实现数据库多版本并发控制(Multiversion Concurrency Control,简称MVCC)。
如果一个事务中的一部分操作已经成功,但另一部分操作,由于断电/系统崩溃/其它的软硬件错误而无法成功执行,则通过回溯日志,将已经执行成功的操作撤销,从而达到全部操作失败的目的。

2.2 持久性

事务的持久性是指:一个事务对数据的所有修改,都会永久的保存在数据库中。
MySQL事务的持久性是通过redo log来实现的。redo log也是InnoDB存储引擎特有的。具体实现机制是:当发生数据修改(增、删、改)的时候,InnoDB引擎会先将记录写到redo log中,并更新内存,此时更新就算完成了。同时InnoDB引擎会在合适的时机将记录刷到磁盘中。
redo log是物理日志,记录的是在某个数据页做了什么修改,而不是SQL语句的形式。它有固定大小,是循环写的方式记录日志,空间用完后会覆盖之前的日志。

undo log和redo log并不是直接写到磁盘上的,而是先写入log buffer。再等待合适的时机同步到OS buffer,再由操作系统决定何时刷到磁盘,具体过程如下:
在这里插入图片描述既然undo log和redo log都是从log buffer 到 OS buffer,再到磁盘。所以中途还是有可能因为断电/硬件故障等原因导致日志丢失。为此MySQL提供了三种持久化方式:这里有一个参数innodb_flush_log_at_trx_commit,这个参数主要控制InnoDB将log buffer中的数据写入OS buffer,并刷到磁盘的时间点,取值分别为0,1,2,默认是1。这三个值的意思如下图所示:
在这里插入图片描述
首先查看MySQL默认设置的方式1,也就是每次提交后直接写入OS buffer,并且调用系统函数fsync()把日志写到磁盘上。就保证数据一致性的角度来说,这种方式无疑是最安全的。但是我们都知道,安全大多数时候意味着效率偏低。每次提交都直接写入OS buffer并且写到磁盘,无疑会导致单位时间内IO的次数过多而效率低下。除此之外,还有方式0和方式2。基本上都是每秒写入磁盘一次,所以效率都比方式1更高。但是方式0是把数据先写入log buffer再写入OS buffer再写入磁盘,而方式2是直接写入OS buffer,再写入磁盘,少了一次数据拷贝的过程(从log buffer到OS buffer),所以方式2比方式0更加高效。

了解了undo log和redo log的作用和实现机制之后,那么这两个日志具体是怎么让数据库从异常的状态恢复到正常状态的呢?

数据库系统崩溃后重启,此时数据库处于不一致的状态,必须先执行一个crash recovery的过程:首先读取redo log,把成功提交但是还没来得及写入磁盘的数据重新写入磁盘,保证了持久性。再读取undo log将还没有成功提交的事务进行回滚,保证了原子性。crash recovery结束后,数据库恢复到一致性状态,可以继续被使用。

2.3 隔离性

数据库事务的隔离性是指:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。正常情况下,肯定是多个事务同时操作同一个数据库,所以事务之间的隔离就显得必不可少。
如果没有隔离性,将会发生以下问题:

2.3.1 第一类丢失更新

一个事务在撤销的时候,覆盖了另一个事务已提交的更新数据。
假设现在有两个事务A、B同时操作同一账户的金额,如下图所示:
在这里插入图片描述
显然,事务B在撤销事务的时候,覆盖了事务A在T4阶段已经提交的更新数据。A在T3的时候已经取走了200元,此时的余额应该是800元,但是由于事务B开始的时候,余额是1000元,所以回滚后,余额也会变成1000元。这样一来,用户明明取了钱,但是余额不变,银行亏到姥姥家了。

2.3.2 脏读

一个事务读到了另一个事务未提交的更新数据。
用下图说明:
在这里插入图片描述
事务A在T3的时候取走了200元,但是未提交。事务B在T4时查询余额就能看到事务A未提交的更新。

2.3.3 幻读

幻读(虚读)是指:一个事务读到了另一个事务已提交的新增数据。
依然是配图说明:
在这里插入图片描述
事务B在同一个事务中执行两次统计操作之间,另一事务insert了一条记录,导致得到的结果不一样,好像发生了幻觉。还有一种情况是事务B更新了表中所有记录的某一字段,之后事务A又插入了一条记录,事务B再去查询发现有一条记录没有被更新,这也是幻读。

2.3.4 不可重复读

不可重复读:一个事务读到了另一个事务已提交的更新数据。
不可重复读,顾名思义,就是在同一个事务中重复读取数据会发生不一致的情况,如下图:
在这里插入图片描述
事务B在T2和T5阶段都执行了查询余额的操作,但是每次得到的结果都不一样,这在开发中是不允许的,同一个事务中同样的多次查询,每次返回不一样的结果,让人不免会对数据库的可靠性产生怀疑。

2.3.5 第二类丢失更新

一个事务在提交的时候,覆盖了另一个事务已提交的更新数据。在这里插入图片描述
由上图可以看出,当事务A提交之后,账户余额已经发生了变动,然后事务B还是基于原始金额(即1000)的基础上扣除取款金额的,事务B以提交,就是把事务A的提交给完全覆盖了。此为第二类丢失更新。

注意和第一类丢失更新区分,第一类丢失更新重点在事务B最终撤销了事务,第二类是最终提交了事务。

为了解决这五类问题,MySQL提供了四种隔离级别:

  • Serializable(串行化):事务之间以一种串行的方式执行,安全性非常高,效率低
  • Repeatable Read(可重复读):是MySQL默认的隔离级别,同一个事务中相同的查询会看到同样的数据行,安全性较高,效率较好
  • Read Commited(读已提交):一个事务可以读到另一个事务已经提交的数据,安全性较低,效率较高
  • Read Uncommited(读未提交):一个事务可以读到另一个事务未提交的数据,安全性低,效率高
隔离级别是否出现第一类丢失更新是否出现脏读是否出现虚读是否出现不可重复读是否出现第二类丢失更新
Serializable否否否否否
Repeatable Read否否是否否
Read Commited否否是是是
Read Uncommited否是是是是

3 Repeatable Read

Repeatable Read(可重复读)是MySQL默认的隔离级别,也是使用最多的隔离级别,所以单独拿出来深入理解很有必要。Repeatable Read无法解决幻读(虚读)问题。下面来看一个实例。
首先创建一个表并插入一条记录:

CREATE TABLE `student` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `stu_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '学生学号',
  `stu_name` varchar(100) DEFAULT NULL COMMENT '学生姓名',
  `created_date` datetime NOT NULL COMMENT '创建时间',
  `modified_date` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `ldelete_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除标志,0:未删除,2:已删除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='学生信息表';


INSERT INTO `student` VALUES (1, 230160340, 'Carson', '2016-08-20 16:37:00', '2016-08-31 16:37:05', 0);

同样的开启两个事务,如下表所示:

时间事务A事务B
T1SELECT * FROM student-
T2-INSERT INTO student VALUES (2, 230160310, ‘Kata’, ‘2016-08-20 16:37:00’, ‘2016-08-31 16:37:05’, 0)
T3-commit
T4SELECT * FROM student-

按照上述理论,会出现幻读现象。也就是事务A在T4时间段的查询select会看到事务B提交的新增数据。
但要让你失望了。

执行结果如下
在这里插入图片描述
和预期的结果并不一致,没有出现幻读现象。
实际上MySQL在Repeatable Read隔离级别下,用MVCC(Multiversion Concurrency Control,多版本并发控制)解决了select普通查询的幻读现象。
具体的实现方式就是事务开始时,第一条select语句查询结果集会生成一个快照(snapshot),并且这个事务结束前,同样的select语句返回的都是这个快照的结果,而不是最新的查询结果,这就是MySQL在Repeatable Read隔离级别对普通select语句使用的快照读(snapshot read)。

快照读和MVCC是什么关系?

MVCC是多版本并发控制,快照就是其中的一个版本。所以可以说MVCC实现了快照读,具体的实现方式涉及到MySQL的隐藏列。MySQL会给每个表自动创建三个隐藏列:

  • DB_TRX_ID:事务ID,记录操作(增、删、改)该数据事务的事务ID
  • DB_ROLL_PTR:回滚指针,记录上一个版本的数据在undo log中的位置
  • DB_ROW_ID:隐藏ID ,创建表没有合适的索引作为聚簇索引时,会用该隐藏ID创建聚簇索引

由于undo log中记录了各个版本的数据,并且通过DB_ROLL_PTR可以找到各个历史版本,并且由DB_TRX_ID决定使用哪个版本(快照)。所以相当于undo log实现了MVCC,MVCC实现了快照读。

如此看来,MySQL的Repeatable Read隔离级别利用快照读,已经解决了幻读的问题。
但是事实并非如此,接下来再看一个例子

时间事务A事务B
T1SELECT * FROM student-
T2-INSERT INTO student VALUES (3, 230160312, ‘Luffy’, ‘2016-08-20 16:37:00’, ‘2016-08-31 16:37:05’, 0)
T3-commit
T4UPDATE student SET stu_name = ‘Katakuri’ WHERE stu_name = ‘Luffy’;-
T5SELECT * FROM student-

事务A在T1的时候生成快照,事务B在T2的时候插入一条数据Luffy,然后提交。在T4的时候把Luffy更新成Katakuri,根据上一个例子的经验,此时事务A是看不到Luffy这条数据的,所以更新也不会成功,并且在T5的时候查询,和T1时候一样,只有Carson和Kata两条数据。

但是,又要让你失望了

执行结果如下
在这里插入图片描述

但是执行结果却不是预期的那样,事务A不仅看到了Luffy,还把它成功的改成了Katakuri。即使事务A成功commit之后,再次查询还是这样。

这其实是MySQL对insert、update和delete语句所使用的当前读(current read)。因为涉及到数据的修改,所以MySQL必须拿到最新的数据才能修改,所以涉及到数据的修改肯定不能使用快照读(snapshot read)。由于事务A读到了事务B已提交的新增数据,所以就产生了前文所说的幻读。

那么在Repeatable Read隔离级别是怎么解决幻读的呢?

是通过间隙锁(Gap Lock)来解决的。我们都知道InnoDB支持行锁,并且行锁是锁住索引。而间隙锁用来锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为Repeatable Read或以上级别而设的,间隙锁和行锁一起组成了Next-Key Lock。当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁,再对索引记录两边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙插入记录。这样就有效的防止了幻读的发生。

默认情况下,InnoDB工作在Repeatable Read的隔离级别下,并且以Next-Key Lock的方式对索引行进行加锁。当查询的索引具有唯一性(主键、唯一索引)时,Innodb存储引擎会对Next-Key Lock进行优化,将其降为行锁,仅仅锁住索引本身,而不是范围(除非锁定不存在的值)。若是普通索引,则会使用Next-Key Lock将记录和间隙一起锁定。

使用快照读的查询语句

SELECT * FROM ...

使用当前读的语句

SELECT * FROM ... lock in share mode
SELECT * FROM ... for update
INSERT INTO table ...
UPDATE table SET ...
DELETE table WHERE ...

4 小结

本文主要讲解了MySQL事务的ACID四大特性,undo log和redo log分别实现了原子性和持久性,log持久化的三种方式,数据库并发下的五类问题、四种隔离级别、RR隔离级别下select幻读通过MVCC机制解决、select ... lock in share mode/select ... for update/insert/update/delete的幻读通过间隙锁来解决。
本文涉及的比较深入,掌握好本文的知识点,让你不仅仅是停留在ACID、隔离级别的层面,在面试中能够化被动为主动,收割大厂offer。

点点关注,不会迷路

《JavaSE系列教程》 本专栏内容是为零基础正在学习Java的学习者量身定制的学习路线及方案,本教程字数超20w+,插图超过400+,知识体系极其全面,案例极其丰富。本配备有专门的学习群及学习视频,读者可加学习群与正在学习该阶段的人一同学习,有任何不懂的也可以观看于此教程配套的学习视频。 阅读详情

相关推荐

MySQL 5.7 中文文档实战:本地知识库搭建与避坑指南

MySQL 5.7 虽已停止主流支持,但仍在大量生产环境中服役。面对官方英文文档的阅读门槛,中文文档成为 DBA 和开发者的刚需。其核心原理在于将版本特性、参数行为与中文语境对齐,降低误用风险。技术价值体现在提升排查效率、减少版本混淆导致的故障。典型应用场景包括 CentOS/Windows 安装初始化、事务与锁的观测、排序分页优化及存储过程调试。通过构建带版本锚点的本地可检索知识库,并挂载团队批注,可将静态文档转化为动态资产。本文围绕 MySQL 5.7 中文文档的深度使用,提供从索引构建到常见翻车场景的

weixin_33883104的博客 182

MySQL--事务持久化原理探究

InnoDB 引擎独有的日志模块,redo log 通常是物理日志,记录的是数据页的物理修改。

Paranoid 1824

协同过滤推荐系统实战:Spring Boot+Vue+MySQL从算法到落地

推荐系统是互联网产品连接用户与内容的核心技术,协同过滤则是其中应用最广的算法范式。它通过分析用户与物品的历史交互行为,计算相似度矩阵,从而预测用户可能感兴趣的物品,实现个性化推荐。在实际工程中,算法需要与后端服务、数据存储和前端展示深度整合,才能真正发挥价值。Spring Boot作为成熟的Java后端框架,负责接口编排与业务逻辑;MySQL承载用户、物品及行为数据;Vue提供动态交互界面。通过将协同过滤计算放在Python离线脚本中完成,在线接口仅查询预计算结果,可以在保证推荐质量的同时实现毫秒级响应。这

weixin_42525005的博客 333

MySQL 数据的持久化

Redo Log 和 Bin Log 各自承担不同的职责:Redo Log 保证数据的持久性和崩溃恢复,而 Bin Log 则主要用于数据备份和复制。: Redo Log 记录的是数据库在内存中的数据变更,所有的变更先写入 Redo Log,确保即便数据库崩溃,系统可以通过 Redo Log 重新执行这些变更,恢复数据库。MySQL 数据的持久化主要依赖于其事务日志( Redo Log 和 Bin Log)来保证,即使在系统崩溃或宕机的情况下也能恢复数据。当写满时,系统会从头开始覆写日志内容。

m0_74064008的博客 1028

实验五 循环结构第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断第4关:通过数列求自然常数e第5关:双倍余额递减法计算固定资产折旧第6关:销售统计第7关:投资年限计算

第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断 第4关:通过数列求自然常数e 第5关:双倍余额递减法计算固定资产折旧

pro_daily的博客 8168

Unity Sprite Editor切片功能详解:如何快速将一张大图拆分成多个小图(附常见问题解决)

本文详细解析了Unity Sprite Editor的切片功能,指导开发者如何高效地将一张大图拆分为多个独立小图。文章涵盖了自动与手动切片操作步骤、轴心点设置、子精灵命名管理等核心技巧,并针对切片错位、性能优化等常见问题提供了实用解决方案,帮助提升2D游戏资源处理效率。

i0j1k2l3m的博客 647

mysql是如何保证持久性的

redo log, binlog,重做日志

majinan3456的博客 2153

华为昇腾Atlas 200I DK A2实战:从开箱到运行首个AI应用

本文详细介绍了华为昇腾Atlas 200I DK A2开发板从开箱到运行首个AI应用的全过程。包括硬件准备、系统烧录、开发板连接方案、AI应用运行及性能优化技巧,帮助开发者快速上手部署AI项目,提升开发效率。

weixin_27038245的博客 591

mysql日志持久化机制

mysql日志持久化机制

qq_41820066的博客 916

ArcGIS基础实战:面数据拓扑创建和错误修改全流程

通过下图的操作我们可以发现,图层的【Shape_Length】和【Shape_Area】字段的数值都发生了改变,表明两个图层重叠的那一部分图斑合并到另一个图班上,其面积会减小、长度会变大(自己重新计算一下也可以得到此验证结果的)。如图【拓扑实验结果】文件夹里右键,新建【文件地理数据库】,并进行命名为【xx拓扑检查】备注:养成良好的命名习惯。然后在【xx拓扑检查】下右键打开【新建要素数据集】,并对数据集进行命名为【XX拓扑】,然后进行下一步设置。在【KK拓扑】数据集上右键,新建【拓扑】。

yuanYW7556的博客 1万+

Stm32L0 STM32CUBE中UART和使用LPUART1以及串口不进中断问题解决

/* 开启串口1中断 */ LL_USART_EnableIT_RXNE(LPUART1); /* 开启串口2中断 */ LL_USART_EnableIT_RXNE(USART2);

シ❤゛甜虾的个人博客 7687

MySQL如何保证持久性

事务的每个操作都会先写入日志,确保即使系统崩溃,数据也能恢复。

weixin_46072507的博客 1160

LLC变压器,常见的4大问题解决方案

其中之一是当付边的绕组的匝数或层数较多的时候,层间或匝间寄生电容和付边的漏感发生一个寄生的振荡,轻载的时候,这个振铃的幅度会达到很高,导致输出电压比设计的要高许多。但当输入是低压的时候,开关频率比较低,LLC谐振回路的增益较大,因而比较容易发生变压器饱和的问题。由于LLC变压器工作在LC谐振状态,LC谐振回路有个特点就是Q值问题,在这里Q值是大于1的,因而就会有实际加在变压器上的电压要比输入电压高的问题,因而在设计变压器的时候就必须考虑到这一点,否则变压器就不是工作在你设计的磁感应强度上。

1265

mysql current read_【享学MySQL】系列:深入理解MySQL中的事务【超详细配图版】

1 引言想必参加过后台开发面试的伙伴们都知道,MySQL事务这玩意是各大面试官百问不厌的知识点,但是大家对于事务的了解到什么层面呢,仅仅停留在ACID上么,这篇文章将陪着大家一起深入MySQL中的事务。2 事务的特性引言中所提到的ACID正是事务的四个特性:分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)原子性(At...

weixin_39827625的博客 124

【车载以太网】【AVB/TSN】IEEE802.1Qav队列及转发协议

目录 一、概述 二、优先级排队算法 三、基于信用的流量整形算法 一、概述 IEEE 802.1Qav 队列及转发协议(Qav)针对不同数据流选择不同的传输选择算法来保障对时间敏感的 AV 数据流的实时传输。为了避免传统的异步以太网数据流量与 AVB 流量之间对网络资源的竞争,AVB 交换机内使用优先级排队算法和基于信用的流量整形算法实现数据流的调度。 二、优先级排队算法 优先级排队算法主要用于传统以太网数据流(BE, Best Effort)的调度传输,BE 流通过基于优先级...

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 4687

SAP_MM_配额安排_PA认证总结

配额安排是企业进行供应商管理的一种方式。通过配额管理,企业可以与多家供应商保持业务往来,以保证某些紧缺原材料的正常供货。此外,企业也可以通过不同的配额比例,提高供应商优化服务、降低价格的积极性。

java_zhong1990的专栏 1021

MySQL事务还能这么理解?这回我知道怎么应付面试官了

显然,事务B在撤销事务的时候,覆盖了事务A在T4阶段已经提交的更新数据。A在T3的时候已经取走了200元,此时的余额应该是800元,但是由于事务B开始的时候,余额是1000元,所以回滚后,余额也会变成1000元。这样一来,用户明明取了钱,但是余额不变,银行亏到姥姥家了。 2.3.2 脏读 一个事务读到了另一个事务未提交的更新数据。 用下图说明: 事务A在T3的时候取走了200元,但是未提交。事务B在T4时查询余额就能看到事务A未提交的更新。 2.3.3 幻读 幻读(虚读)是指:一个事务读到了另一个事务已提

m0_63174475的博客 283

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

深入理解MySQL:体系结构与SQL语句执行流程

在数据库领域,MySQL作为开源关系型数据库的佼佼者,被广泛应用于各类系统中。无论是日常业务查询还是高频数据更新,了解MySQL的内部体系结构与SQL语句执行流程,都是开发者优化性能、排查问题的核心基础。本文将从MySQL的分层结构入手,详细拆解查询语句与更新语句的完整生命周期,帮助大家建立对MySQL运行机制的系统性认知。

专注Java和MySQL领域知识分享 1002

深度学习工具包 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")

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL事务还能这么理解?这回我知道怎么应付面试官了,熬夜整理最新大厂Java高频面试题

了解了undo log和redo log的作用和实现机制之后,那么这两个日志具体是怎么让数据库从异常的状态恢复到正常状态的呢? 数据库系统崩溃后重启,此时数据库处于不一致的状态,必须先执行一个crash recovery的过程:首先读取redo log,把成功提交但是还没来得及写入磁盘的数据重新写入磁盘,保证了持久性。再读取undo log将还没有成功提交的事务进行回滚,保证了原子性。crash recovery结束后,数据库恢复到一致性状态,可以继续被使用。 2.3 隔离性 数据库事务的隔离性是指:多.

m0_64384202的博客 299

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL事务还能这么理解?这回我知道怎么应付面试官了,目前最全的《Java面试题及解析》

首先查看MySQL默认设置的方式1,也就是每次提交后直接写入OS buffer,并且调用系统函数fsync()把日志写到磁盘上。就保证数据一致性的角度来说,这种方式无疑是最安全的。但是我们都知道,安全大多数时候意味着效率偏低。每次提交都直接写入OS buffer并且写到磁盘,无疑会导致单位时间内IO的次数过多而效率低下。除此之外,还有方式0和方式2。基本上都是每秒写入磁盘一次,所以效率都比方式1更高。但是方式0是把数据先写入log buffer再写入OS buffer再写入磁盘,而方式2是直接写入OS b.

m0_64867896的博客 113

【第2章】Seata1.3.0源码编译+参数配置+启动运行(超详细)

一、什么是Seata? 官网地址:https://seata.io 提炼关键词: 特性: 1、一致性(这个是痛点,解决的就是微服务分布式事务一致性的问题) 2、高性能(这个是卖点,如果用了反而拖累整个微服务架构的性能,试问谁还会用呢?) 3、易用性(这个是亮点,大家开发时引入新技术,都希望简单好用,如果技术太过于复杂,反而会提升使用门槛,吓跑用户) 事务模式 AT (AutomaticTransaction,对业务系统无侵入,省去了用的人很多编码的工作) ...

Appleyk的专栏 10万+

你了解MySQL?

开局一张图,内容全靠编 实例&&数据库傻傻分不清 数据库 就是一堆数据文件的集合,相当于一个大文件夹其中包含了各种格式的数据文件,不同的数据格式代表使用了不同的存储引擎,如我们经常使用的innoDB在磁盘上的存储格式就是.ibd文件,还有frm MYD MYI格式的,代表不同的存储引擎。如果当前的数据表出现问题,可以从这个数据文件执行恢复数据。需要特别注意的是存储引擎的粒度...

Chaos Awakening 217

Java程序员必读精选书籍分享,强烈推荐

Java程序员必读精选书籍分享!强烈推荐!

小白码上飞 1万+
上一篇: Java并发理论(二):as-if-serial规则和happens-before规则详解
下一篇: Java并发编程(六):volatile原理详解
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值