事务

MySQL事务的实现原理

扶醉桌前 提交于 2020-03-09 08:47:27
天天用事务,但是你知道MySQL事务的实现原理吗? 1. 开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等。今天想跟大家一起研究下事务内部到底是怎么实现的,在讲解前我想先抛出个问题: 事务想要做到什么效果? 按我理解,无非是要做到可靠性以及并发处理。 可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undo log和redo log。 并发处理:也就是说当多个并发请求过来,并且其中有一个请求是对数据修改操作的时候会有影响,为了避免读到脏数据,所以需要对事务之间的读写进行隔离,至于隔离到啥程度得看业务系统的场景了,实现这个就得用MySQL 的隔离级别。 下面我首先讲实现事务功能的三个技术,分别是日志文件(redo log 和 undo log),锁技术以及MVCC,然后再讲事务的实现原理,包括原子性是怎么实现的,隔离型是怎么实现的等等。最后在做一个总结,希望大家能够耐心看完 redo log与undo log介绍 mysql锁技术以及MVCC基础 事务的实现原理 总结 2 redo log 与 undo log介绍 1. redo

性能测试指标

血红的双手。 提交于 2020-03-09 05:19:03
性能测试监控关键指标说明:   ①. 资源指标   CPU使用率:指用户进程与系统进程消耗的CPU时间百分比,长时间情况下,一般可接受上限不超过85%。   内存利用率:内存利用率=(1-空闲内存/总内存大小)*100%,一般至少有10%可用内存,内存使用率可接受上限为85%。   磁盘I/O: 磁盘主要用于存取数据,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据的时候对应的是写IO操作,取数据的时候对应的是是读IO操作,一般使用% Disk Time(磁盘用于读写操作所占用的时间百分比)度量磁盘读写性能。   网络带宽:一般使用计数器Bytes Total/sec来度量,Bytes Total/sec表示为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较。   ②.系统指标   并发用户数:某一物理时刻同时向系统提交请求的用户数。   在线用户数:某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求。   平均响应时间:系统处理事务的响应时间的平均值。事务的响应时间是从客户端提交访问请求到客户端接收到服务器响应所消耗的时间。对于系统快速响应类页面,一般响应时间为3秒左右。   事务成功率:性能测试中,定义事务用于度量一个或者多个业务流程的性能指标,如用户登录、保存订单、提交订单操作均可定义为事务。 来源

Flume面试题

一世执手 提交于 2020-03-08 23:01:01
1 你是如何实现Flume数据传输的监控的 使用第三方框架Ganglia实时监控Flume。 2 Flume的Source,Sink,Channel的作用?你们Source是什么类型? 1、作用 (1)Source组件是专门用来收集数据的,可以处理各种类型、各种格式的日志数据,包括avro、thrift、exec、jms、spooling directory、netcat、sequence generator、syslog、http、legacy (2)Channel组件对采集到的数据进行缓存,可以存放在Memory或File中。 (3)Sink组件是用于把数据发送到目的地的组件,目的地包括Hdfs、Logger、avro、thrift、ipc、file、Hbase、solr、自定义。 2、我公司采用的Source类型为: (1)监控后台日志:exec (2)监控后台产生日志的端口:netcat Exec spooldir 3 Flume的Channel Selectors 官方文档上channel selectors 有两种类型:Replicating Channel Selector (default), Multiplexing Channel Selector 这两种selector的区别是:Replicating 会将source过来的events发往所有channel

性能测试--2、有效应用程序性能测试的基本原则

青春壹個敷衍的年華 提交于 2020-03-08 19:40:36
在应用程序的生命周期中,应尽早建立性能测试意识。 确保应用一切就绪 需要考虑的问题: 应用程序部署后需要支持多少最终用户?6个月后?1年后?3年后呢? 这些用户分布在哪里?他们是如何与系统建立连接的? 部署后有多少在线用户、并发用户?6个月后?1年后?3年后呢? 引申出的问题: 对于每个应用程序,需要多少台服务器?这些服务器的配置是怎么样?是否需要集群? 我需要提供什么类型的网络基础设施? 性能测试重点关注的方面: 选择合适的性能测试工具; 设计一个合适的性能测试环境; 设置切合实际的性能测试目标; 确保被测应用程序足够稳定; 安排有足够的时间进行有效的性能测试; 做到代码冻结; 确定和编写关键业务脚本; 提供高质量、足够的测试数据; 确保准确的性能测试设计; 确定监控服务器和网络的关键性指标(KPI); 安排有足够的时间进行有效的性能测试。 性能测试工具 性能测试工具要求: 协议支持(通信协议); 认证模式(License); 概念验证(Proof of concept,简称POC,证明其可行性,示范其原理); 脚本效果(生成脚本的编辑程度); 解决方案与负载测试工具(提供解决方案); 外包性能测试or内部执行。 注意:制定替代方案。 预留足够时间 安排足够的时间确保有效的性能测试。 需要考虑的几个方面: 准备测试环境的时间 准备负载生成器环境 确定及描述业务事务的时间

高性能MySQL之锁详解

感情迁移 提交于 2020-03-08 12:07:19
原文: 高性能MySQL之锁详解 一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对整个数据库实例加锁,可以通过命令 Flush tables with read lock (FTWRL)对整个数据库实例子加锁。让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁有一个经典的使用场景就是做全库逻辑备份,也就是说吧整个数据库的每个表都用select 出来存成文本。以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。 你此时是不是觉得很危险? 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 看上去确实很危险,但是我们细想一下,备份为什么要加锁呢?如果我们不加锁又会出现什么问题呢? 假设你现在要维护京东的购买系统

mysql面试知识点

Deadly 提交于 2020-03-08 10:54:05
1 MyISAM和InnoDB的区别    a 是否支持行级锁 :   MyISAM 只有表级锁 (table-level locking),   而 InnoDB 支持行级锁 (row-level locking)和表级锁,默认为行级锁。    b 是否支持事务和崩溃后的安全恢复:    MyISAM 强调的是性能 ,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。   但是 InnoDB 提供事务支持事务 ,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。    c 是否支持外键:   MyISAM不支持,而InnoDB支持。    d 是否支持MVCC :   仅 InnoDB 支持。应对高并发事务, MVCC比单纯的加锁更高效;MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作;MVCC可以使用 乐观(optimistic)锁 和 悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统一。 2 索引   MySQL索引使用的数据结构主要有 BTree索引 和 哈希索 引 。   对于 哈希索引 来说

mysql共享锁与排他锁

允我心安 提交于 2020-03-08 08:38:18
mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from.

数据库 mysql整体框架

ぐ巨炮叔叔 提交于 2020-03-08 06:00:54
数据库 mysql整体框架 文章目录 数据库 mysql整体框架 1、体系结构 2、存储引擎 2.1MyISAM存储引擎 2.2 InnoDB存储引擎 1、体系结构 连接者:不同语言的代码程序和mysql的交互(SQL交互) 1、 连接池 管理 : 缓冲用户的连接,线程处理等需要缓存的需求 2、 管理服务和工具组件 :系统管理和控制工具,例如备份恢复、Mysql复制、集群等 3、 sql接口 :接受用户的SQL命令,并且返回用户需要查询的结果 4、 查询解析器 : SQL命令传递到解析器的时候会被解析器验证和解析(权限、语法结构) 5、 查询优化器 : SQL语句在查询之前会使用查询优化器对查询进行优化 6、 缓存 :如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据 7、 插入式存储引擎 :存储引擎说白了就是如何管理操作数据(存储数据、如何更新、查询数据等)的一种方法。因为在关系数据库 中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) 说明: 在Oracle 和SQL Server等数据库中,所有数据存储管理机制都是一样的。 而MySql数据库提供了多种存储引擎 。 用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。 2

事务与事务隔离级别

左心房为你撑大大i 提交于 2020-03-08 05:28:49
oracle事务 事务含义:组成单个逻辑单元的一系列操作。 事务特征: 第一、原子性,即不可分割性; 第二、一致性,保证数据更新前后与业务的一致性; 第三、隔离性,多个事务不相影响; 第四、持久性,事务提交后数据将永久存储杂数据库。 隔离级别 : 1.未提交读(read uncommitted):会出现脏读、不可重复读和幻读。脏读的设计只是为了提供非阻塞读,但是对于oracle来说,默认就提供非阻塞读, 即查询不会受到任何增删改操作的影像,因为oracle提供了undo来存放更新前的数据。 2.提交读(read committed):会出现不可重复读和幻读。oracle的默认事务隔离级别。 3.重复读(repeatable read):会出现幻读。 4.串行化(serializable):隔离级别最高,不允许出现脏读、不可重复读和幻读。即一个事务执行结束了另一个事务才能执行。当然并发性也就最差。 除了这四种,oracle还提供read only隔离级别,即只支持读,在该级别中,该事务只能看到事务开始那一刻提交的修改。 脏读、不可重复读、幻读含义 脏读:一个事务可以读物另一个事务未提交的数据。 不可重复读:在一个事务中不同时间段查询出现不同的结果,可能被更新可能被删除。 幻读:在一个事务中不同时间段查询,记录数不同。与不可重复读的区别是:在幻读中,已经读取的数据不会改变

2PC与3PC

爱⌒轻易说出口 提交于 2020-03-08 01:30:18
一、二阶段提交 2PC:又名二阶段提交,将事物提交分成两个阶段来进行处理。它是一种分布式数据一致性的协议。目前绝大多数关系型数据库都使用2PC来完成事物操作,利用该协议能够方便地完成分布式事物协调者和参与者,统一决定事物的提交和回滚,从而保证分布式数据的一致性。 第一阶段是提交事物请求。这个阶段可以理解为投票阶段,即协调者向所有参与者发送事物内容,询问是否可以执行事物提交操作,并开始等待参与者的响应(有超时时间)。协调者执行事物操作(但不提交事物!!!!!!!!!),生成undo和redo日志。参与者向协调者反馈响应结果。 第二阶段是执行事物提交。协调者根据参与者的反馈来决定最终是否进行事物提交操作,正常情况下分成两种情况:执行事物提交或者中断事物(所有反馈者都反馈yes或者至少有一个参与者反馈no),这时协调者向所有参与者发送commit或者rollback请求,参与者进行事物提交操作后并向协调者发送ack消息,从而完成或者回滚事物。 2PC的优缺点:优点:简单粗暴。缺点:可能会造成脑裂,同步阻塞,单点问题,太过保守。 二、三阶段提交 3PC:又名三阶段提交,将事物提交分成CanCommit、PreCommit、DoCommit三个阶段。 第一阶段:CanCommit阶段,协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。 第二阶段