MySQL高级篇-16-多版本并发控制
MVCCMVCC (Multiversion Concurrency Control,多版本并发控制),通过数据行的多个版本管理来实现数据库的并发控制 ,保证在InnoDB的事务隔离级别下执行一致性读操作。为查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,在做查询时就不用等待另一个事务释放锁。
快照读与当前读 MVCC在MySQL InnoDB中的实现主要是为提高数据库并发性能,用更好的方式去处理读-写冲突,即使有读写冲突时,也能做到不加锁、非阻塞并发读 ,这里的读指的是快照读 , 而非当前读 。当前读实际上是一种加锁的操作,是悲观锁的实现,而MVCC本质是采用乐观锁思想的一种方式。
快照读快照读称一致性读,读取的是快照数据。不加锁的简单的 SELECT 都属于快照读,即不加锁的非阻塞读
1SELECT * FROM player WHERE ...
基于提高并发性能采用快照读,快照读的实现基于MVCC。在很多情况下避免加锁操作、降低开销。 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,有可能是之前的历史版本。
快照读的前提是隔离级别不是串 ...
JVM 字节码与类的加载篇-2-字节码指令集与解析
概述
Java字节码对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令
Java 虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。由于Java虚拟机采用面向操作数栈而不是寄存器的结构,所以大多数的指令都不包含操作数,只有一个操作码。
由于限制Java虚拟机操作码的长度为一个字节(0~255),指令集的操作码总数不可能超过256条。
执行模型如果不考虑异常处理的话,那么Java虚拟机的解释器可以使用下面这个伪代码当做最基本的执行模型来理解:
字节码与数据类型Java虚拟机的指令集中大多数的指令都包含其操作所对应的数据类型信息。例如, iload指令用于从局部变量表中加载int型的数据到操作数栈中,而fload指令加载的则是float类型的数据。
字符
说明
i
对int类型的数据操作
l
对long类型的数据操作
s
对short类型的数据操作
b
对byte类型的数据操作
c
对char类型的数据操作
f
对float类型的数 ...
MySQL高级篇-15-锁
锁:
事务的隔离性由锁实现
概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某数据时,尤其是针对一些敏感的数据(比如订单、全额等),就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性
为保证数据的一致性,需要对并发操作进行控制,因此出现锁。同时锁机制为实现MySQL的各个隔离级别提供保证。锁冲突是影响数据库并发访问性能的一个重要因素。
MySQL并发事务访问相同记录读-读情况读-读情况,即并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响,并不会引起问题,因此允许这种情况的发生。
写-写情况写-写情况,即并发事务相继对相同的记录做出改动。
这种情况下会发生脏写问题,任何一种隔离级别都不允许该问题发生,在多个未提交事务 相继对一条记录做改动时,需要让它们 “排队执行” ,这个过程其实是通过锁来实现的。锁其实是一个内存中的结构,在事务执行前本来是没有锁的,即一开始是没有锁结构和记录进行关联
当一个事务想对这条记录做改动时,首先会看看内存中有没有与这条记录关联的锁结构,当没有时会在 ...
MySQL高级篇-14-MySQL事务日志
ACID 特性实现
事务的隔离性由锁机制实现
事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证
REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性
UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性
REDO和UNDO都可以视为是一种恢复操作:
redo log:存储引擎层(innodb)生成的日志,记录的是物理级别上的页修改操作,比如页号xx、偏移量yy写入了’zzz’数据,保证数据的可靠性
undo log:存储引擎层(innodb)生成的日志,记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么undo log就记录一条与之相反的DELETE操作。主要用于事务回滚(undo log 记录的是每个修改操作的逆操作)和一致性非锁定读(undo log回滚行记录到某种特定的版本—-MVCC,即多版本并发控制)
REDO 日志InnoDB存储引擎是以页为单位来管理存储空间,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool后才可 ...
JVM 字节码与类的加载篇-1-Class文件结构
概述字节码文件的跨平台性
Java语言:跨平台的语言
当Java源代码成功编译成字节码后,如果想在不同的平台上面运行,则无须再次编译
Java虚拟机:跨语言的平台
Java虚拟机不和包括Java在内的任何语言绑定,它只与Class 文件特定的二进制文件格式所关联。无论使用何种语言进行软件开发,只要能将源文件编译为正确的Class文件,那么这种语言就可以在Java虚拟机上执行。
要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码
前端编译器的主要任务就是负责将符合Java语法规范的Java代码转换为符合JVN规范的字节码文件
javac是一种能够将Java源码编译为字节码的前端编译器
javac编译器在将Java源码编译为一个有效的字节码文件过程中经历了4个步骤
词法解析
语法解析
语义解析
生成字节码
Java的前端编译器
Java源代码的编译结果是字节码,那么肯定需要有一种编译器能够将Java源码编译为字节码,承担这个重要责任的就是配置在path环境变量中的javac编译器。javac是一种能够将Java源码编译为字节码 ...
MySQL高级篇-13-数据库事务
数据库事务概述事务是数据库区别于文件系统的重要特性之一,有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,可以保证已提交到数据库的修改不会因为系统崩溃而丢失。
存储引擎支持情况SHOW ENGINES命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务。
事务基本概念
事务
数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成
事务处理的原则
保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方 式。当在一个事务中执行多个操作时,要么所有的事务都被提交commit,那么这些修改就永久地保 存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚rollback到最初状态。
事务的ACID特性
ACID特性
说明
原子性
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到 ...