mysql事务

数据库分库分表思路

浪子不回头ぞ 提交于 2019-12-02 08:09:41
一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销

MySQL 日志系统之 redo log 和 binlog

旧城冷巷雨未停 提交于 2019-12-02 06:28:47
之前我们了解了一条查询语句的执行流程,并介绍了执行过程中涉及的处理模块。一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。 那么,一条 SQL 更新语句的执行流程又是怎样的呢? 首先我们创建一个表 user_info,主键为 id,创建语句如下: CREATE TABLE `T` ( `ID` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 插入一条数据: INSERT INTO T VALUES ('2', '1'); 如果要将 ID=2 这一行的 c 的值加 1,SQL 语句为: UPDATE T SET c = c + 1 WHERE ID = 2; 前面介绍过 SQL 语句基本的执行链路,这里把那张图拿过来。因为,更新语句同样会走一遍查询语句走的流程。 通过连接器,客户端与 MySQL 建立连接 update 语句会把 T 表上的所有查询缓存结果清空 分析器会通过词法分析和语法分析识别这是一条更新语句 优化器会决定使用 ID 这个索引(聚簇索引) 执行器负责具体执行,找到匹配的一行,然后更新 更新过程中还会涉及 redo log(重做日志)和 binlog(归档日志)的操作

mysql事务提交和回滚机制

限于喜欢 提交于 2019-12-02 05:50:42
应用场景: 银行取钱,从ATM机取钱,分为以下几个步骤 1 登陆ATM机,输入密码; 2 连接数据库,验证密码; 3 验证成功,获得用户信息,比如存款余额等; 4 用户输入需要取款的金额,按下确认键; 5 从后台数据库中减掉用户账户上的对应金额; 6 ATM吐出钱; 7 用户把钱拿走。 对于上面的取钱这个事情,如果有一步出现错误的话,那么就会取消整个取钱的动作,但是如果在第5步,系统后台已经把钱减了,但是ATM机没有取出来,那么就应用到mysql中的事务。简单地 来说,就是取钱这7步要么都完成,要么就啥也不做,在数据库中就是这个道理。 事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销,在事务中,每个正确的原子 操作都会被顺序执行,直到遇到错误的原子操作。回滚的意思其实即使如果之前是插入操作的话,那么会执行删除之前插入的记录,如果是修改操作的话,那么会执行将update之前的记录还原。 因此,正确的原子操作是真正被执行过的,是物理执行。 事务是由一条或者多条sql语句组成,在事务的操作中,要么这些sql语句都执行,要么都不执行。 事务的ACID特性:原子性,一致性,隔离性,持久性。 在当前事务中确实能看到插入的记录,最后只不过被删除了,但是auto_increament不会删除而是改变值

Python操作三大主流数据库✍✍✍

让人想犯罪 __ 提交于 2019-12-02 05:49:29
Python操作三大主流数据库 Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库: GadFly mSQL MySQL PostgreSQL Microsoft SQL Server 2000 Informix Interbase Oracle Sybase 不同的数据库你需要下载不同的 DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。 DB-API 是一个规范. 它定义了一系列必须的对象和数据库存取方式, 以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口 。 Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。 Python DB-API使用流程: 引入 API 模块。 获取与数据库的连接。 执行 SQL语句和存储过程。 关闭数据库连接。 什么是 MySQLdb? MySQLdb 是用于Python链接Mysql数据库的接口,它实现了 Python 数据库 API 规范 V2.0,基于 MySQL C API 上建立的。 如何安装 MySQLdb? 为了用 DB-API编写MySQL脚本

mysql事务和锁

会有一股神秘感。 提交于 2019-12-02 05:05:32
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题 1.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性。 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。 银行转帐就是事务的一个典型例子。 //https://blog.csdn.net/bigtree_3721/article/details/77417518 2.并发事务处理带来的问题 相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量

MySQL各大存储引擎

痴心易碎 提交于 2019-12-02 05:02:33
MySQL各大存储引擎: 最好先看下你下的MySQL支持什么数据库引擎 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Blackhole, 5. CSV, 6. Performance_Schema, 7. Archive, 8. Federated , 9 Mrg_Myisam 但是我们主要分析使用MyIsam 和InnoDB。其余略微带过,详情请分别百度。 (1)InnoDB: 定义: (默认的存储引擎) InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这类型的文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的

细谈Mysql事务

谁说胖子不能爱 提交于 2019-12-02 02:56:45
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上一篇着重谈到了MySQL锁的概念,里面谈到了事务的概念,其实大部分开发者对于事务肯定不陌生,事务的概念其实就是一组SQL语句组成一个执行单元,如果单元中的某个SQL语句执行出现异常,则需要将整个事务进行回滚到未修改的状态。只有单元中全部SQL语句都成功执行,才会提交数据代表事务执行成功。而Mysql其实前几篇我们都已经知道是支持多种存储引擎的,其实正是因为MyISAM引擎不支持事务被InnoDB取代的原因。所以本篇文章主要是针对InnoDB引擎详细了解下事务这个概念。 事务特性 原子性: 事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 一致性:事务中包含的处理要满足数据库提前设置的约束,如主键约束或者NOT NULL 约束等。 隔离性:事务处理过程中的中间状态对外部是不可见的。 持久性:事务完成之后,它对于数据的修改是永久性的。 隔离性的四种隔离级别 InnoDB引擎支持的4种事务隔离级别分别是:读未提交、读已提交、可重复读、串行读。 读未提交:允许脏读,可以读取其他session中未提交的脏数据。 读已提交:不可读取其他session尚未提交的数据,只有其他session数据已提交才能读取到,为不重复读。 可重复读:该级别下可重复读,InnoDB引擎默认采用可重复读

Mysql锁机制

冷暖自知 提交于 2019-12-02 02:55:08
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中数据其实是一种供大量用户共享的资源,所以在并发访问时我们需要保证数据的一致性和有效性,而锁冲突是影响数据库并发性能最关键的因素之一。所以本篇文章主要讨论Mysql中锁机制的特点。Mysql的锁机制包含多种:行锁,表锁,读锁,写锁等,其实就是使用不同的存储引擎会支持不同的锁机制。而我主要是针对InnoDB存储引擎下的7种类型的锁进行介绍。 InnoDB引擎锁类型: 共享/排它锁 记录锁 间隙锁 临键锁 自增锁 意向锁 插入意向锁 MySQL中InnoDB存储引擎与MyISAM存储引擎锁机制其实有两个比较显著的不同点: InnoDB支持事务操作。 InnoDB默认采用行级锁。 InnoDB锁机制实现原理 InnoDB存储引擎其实是通过给索引上的索引项添加锁,也正是由于给索引项加锁,所以只有通过索引条件查询数据,InnoDB引擎才会选择使用行级锁,否则会使用表锁。行级锁与表级锁本身有许多不同之处,事务的引入也带来了一些新问题。 事务 说到事务,四个最基本的特性我想大多数人再清楚不过了: 原子性: 事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。 一致性:在事务开始和完成时,数据都必须保持一致状态。 隔离性

MySQL事务原理浅析

别等时光非礼了梦想. 提交于 2019-12-02 02:44:46
前言 ​ 因为自己对数据的可靠性,可用性方面特别感兴趣,所以在MySQL事务方面看了很多资料,也看了很多博客,所以想到自己也写一篇博客整理整理自己所学内容,尽量用自己的语言解释得通俗易懂。 事务经典场景 ​ 在很多介绍事务的博客都会代入这样一个场景,先简单说说: ​ A给B转账100,A少100,B多100。如果A少100后系统崩溃怎么办?B的钱多不了,这样金钱总数凭空少了100。这里就需要用到事务了。 什么是事务? ​ 事务是恢复和并发控制的基本单位,事务有四个特性(ACID),原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。本文主要围绕这四个特性展开介绍。 原子性 ​ 原子性就是不可拆分的特性,要么全部成功然后提交(commit),要么全部失败然后回滚(rollback)。若开启事务,在上述场景就不会出现 A少100 成功,B多100 失败 这种情况。MySQL通过Redo Log重做日志实现了原子性,在将执行SQL语句时,会先写入redo log buffer,再执行SQL语句,若SQL语句执行出错就会根据redo log buffer中的记录来执行回滚操作,由此拥有原子性。 一致性 ​ 一致性指事务将数据库从一种状态转变为下一种一致的状态。比如有一个字段name有唯一索引约束

主从复制系列C

浪尽此生 提交于 2019-12-02 01:54:02
近日接到一个故障,主从异步方式,主 crash后,从不可用,检查发现从机Read_Master_Log_Pos与Exec_Master_Log_Pos不一致,似乎还有binlog在回放中,HA在等回放结束,一直保持这个状态。难道从机也出故障了?根本原因是什么?且看下文。 MySQL binlog简介 首先简单了解要下binlog日志,Binary Log是在MySQL3.23.14中引入的,记录MySQL数据修改记录的文件集合。 Binary Log有两个目的: 用于复制。master(主)上的binlog日志发送到slave(从)上,slave执行回放master上的修改动作,保持主从数据一致。 用于数据恢复。对binlog日志文件指定始末位置执行即恢复指定数据。 本文是针对复制流程中的一个改进,不涉及数据恢复。 基于binlog的复制简介 Master上对修改动作生成binlog,Slave机IO拉取对应的binlog到本地生成relay log,然后Slave机SQL线程回放执行。binlog的最小单位为event,master与slave之间以 event为单位 传输日志,一个或多个event组成一个事务,slave机上以 事务为单位 回放日志。事务是数据库的常见基本特性,不再介绍,这里主要介绍下binlog中的event。 事务event包含header 和data