InnoDB

MySQL事务隔离级别中可重复读与幻读

懵懂的女人 提交于 2020-08-18 03:50:42
每次谈到数据库的事务隔离级别,大家一定会看到这张表. 其中, 可重复读 这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读, 可能 发生幻读就表示 可重复读 这个隔离级别防不住幻读吗? 我不管从数据库方面的教科书还是一些网络教程上,经常看到RR级别是可以重复读的,但是无法解决幻读,只有可串行化(Serializable)才能解决幻读,这个说法是否正确呢? 在这篇文章中,我将重点围绕MySQL中 可重复读(Repeatable read)能防住幻读吗? 这一问题展开讨论,相信看完这篇文章后,你一定会对事务隔离级别有新的认识. 我们的数据库中有如下结构和数据的 Users 表,下文中我们将对这张表进行操作, 长文预警,读完此篇文章,大概需要您二十分钟. 什么是幻读? 在说幻读之前,我们要先来了解脏读和不可重复读. 脏读 当一个事务读取到另外一个事务修改但未提交的数据时,就可能发生脏读。 在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。 不可重复读 “不可重复读”现象发生在当执行SELECT 操作时没有获得读锁或者SELECT操作执行完后马上释放了读锁; 另外一个事务对数据进行了更新,读到了不同的结果. 在这个例子中,事务2提交成功

MySQL FEDERATED引擎 远程调用数据库

本小妞迷上赌 提交于 2020-08-18 03:43:52
FEDERATED 引擎 使用注意事项 通过 FEDERATED 引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中,通过这个引擎可以实现类似Oracle下DBLINK的远程数据访问功能,就是说,这种建表方式只会在数据库A中创建一个表B的表结构文件,表的索引,数据等文件还是在机器B上的数据库B中,相当于只是在数据库A中创建了表B的一个快捷方式 FEDERATED 表可能会被复制到其他的slave数据库,你需要确保slave服务器也能够使用定义在connection中或mysql.servers表中的link的用户名/密码 连接上远程服务器 远程服务器必须是MySQL数据库 在访问FEDERATED表中定义的远程数据库的表前,远程数据库中必须存在这张表 FEDERATED 表不支持通常意义的索引,服务器从远程库获取所有的行然后在本地进行过滤,不管是否加了where条件或limit限制 查询可能造成性能下降和网络负载,因为查询返回的数据必须存放在内存中,所以容易造成使用系统的swap分区或挂起 FEDERATED表不支持字段的前缀索引 FEDERATED表不支持ALTER TABLE语句或者任何 DDL语句 FEDERATED表不支持事务 本地FEDERATED表无法知道远程库中表结构的改变 任何drop语句都只是对本地库的操作,不对远程库有影响 FEDERATED

MySQL日志体系详解

落花浮王杯 提交于 2020-08-18 00:18:30
前言 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。 MySQL的日志体系有如下几种分类: 错误日志 查询日志 慢查询日志 事务日志(Redo log) 二进制日志 中继日志 其中标粗的事务日志和二进制日志,是重中之重。 1 错误日志 在默认情况下,MySQL的错误日志是开启的,且无法被禁止。在没有指定的情况下,它一般是存储在数据库的数据文件目录中,名称为hostname.err,其中,hostname为服务器主机名。 1.1 错误日志的内容 服务器启动和关闭过程中的信息,未必是错误信息,比如mysql是如何去初始化存储引擎的过程记录在错误日志里等等 服务器运行过程中的错误信息(或者告警信息),比如sock文件找不到,无法加载mysql数据库的数据文件,如果忘记初始化mysql或data dir路径找不到,或权限不正确等 都会记录在此 事件调度器运行一个事件时产生的信息,一旦mysql调度启动一个计划任务(event scheduler)的时候,它也会将相关信息记录在错误日志中 在从服务器上启动从服务器进程时产生的信息,在复制环境下

MySQL创建主键

人走茶凉 提交于 2020-08-17 18:22:49
MySQL InnoDB 存储引擎是必须要有一个主键的,主键可以是一个字段或者多个字段,通常建议:主键就一个、主键字段和业务无关、主键字段最好是自增且字段较小(原因: 索引原理 )。 创建主键的三种方式: 在建表语句字段后指定 PRIMARY KEY 关键字设置主键,这种方式只能定义主键为一个字段的情况,如下所示: CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键', `name` varchar(32) DEFAULT '' COMMENT '名字' ) ENGINE=InnoDB CHARSET=utf8 COMMENT ='用户信息表'; 在建表语句之后,指定 PRIMARY KEY(column1,column2) ,这种方式可以定义主键为多个字段的情况,如下所示: CREATE TABLE `t_user` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '自增主键', `name` varchar(32) DEFAULT '' COMMENT '名字', PRIMARY KEY (`id`) ) ENGINE=InnoDB CHARSET=utf8 COMMENT ='用户信息表';

mysql的默认隔离级别

与世无争的帅哥 提交于 2020-08-17 17:07:56
原文:https://www.cnblogs.com/rjzheng/p/10510174.html 知识点总结 ----------------------------------------------------------------------------------------------------------------------- 1.数据库默认隔离级别: mysql ---repeatable,oracle,sql server ---read commited 2.mysql binlog的格式三种:statement,row,mixed 3.为什么mysql用的是repeatable而不是read committed:在 5.0之前只有statement一种格式,而主从复制存在了大量的不一致,故选用repeatable 4.为什么默认的隔离级别都会选用read commited 原因有二:repeatable存在间隙 锁会使死锁的概率增大, 在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行 2.在RC级用别下,主从复制用什么binlog格式: row格式,是基于行的复制! -----------------------------------------------------------------------------------

实战分享丨MySQL 与Django版本匹配相关经验

心已入冬 提交于 2020-08-17 15:44:31
摘要: 关于MySQL 与Django版本匹配相关知识的经验分享。 run: (env) E:\PythonPro\PyDjangoProDemo011\xuanyuaniotpro>python manage.py migrate 报错代码提示如下: raise errorclass(errno, errval) django.db.utils.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1") During handling of the above exception, another exception occurred: 根据提示分析报错原因: Django2.1不再支持MySQL5.5,必须mysql5.6版本以上 查mysql版本和Django版本: mysql版本: Django版本: 根据原因分析得出解决思路: 二选一 (1)Django降级到2.0 (env) PS E:\PythonPro\PyDjangoProDemo011

spring事务详解(一)初探事务

狂风中的少年 提交于 2020-08-17 15:25:45
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多coder在不理解事务的原理甚至连基本概念都不清楚的情况下,就去使用数据库事务,是极容易出错,写出一些自己不能掌控的代码。网上很多文章要不就是概念,或者一点源码,或者一点测试验证,都不足以全面了解事务,所以本文出现了,本系列Spring事务详解包含四部分: 第一章 讲概念,对事务的整体有一个了解。 第二章 简单样例,了解如何用。 第三章 从源码来看底层实现机制。 第四章 实例测试验证。 第五章 总结提高。 个人能力有限,有任何不当之处,麻烦指出。 全文基于Mysql innodb引擎。Mysql官方文档: 官网飞机票 ,推荐书籍: 《Mysql技术内幕-InnoDB存储引擎》。 一、背景 1.1 拜神 spring事务领头人叫Juergen Hoeller,于尔根·糊了...先混个脸熟哈,他写了几乎全部的spring事务代码。读源码先拜神,掌握他的源码的风格,读起来会通畅很多。最后一节咱们总结下这个大神的代码风格。 1.2 事务的定义 事务(Transaction)是数据库区别于文件系统的重要特性之一。目前国际认可的数据库设计原则是ACID特性,用以保证数据库事务的正确执行

spring事务详解(一)初探事务

痴心易碎 提交于 2020-08-17 14:46:16
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 引子 很多coder在不理解事务的原理甚至连基本概念都不清楚的情况下,就去使用数据库事务,是极容易出错,写出一些自己不能掌控的代码。网上很多文章要不就是概念,或者一点源码,或者一点测试验证,都不足以全面了解事务,所以本文出现了,本系列Spring事务详解包含四部分: 第一章 讲概念,对事务的整体有一个了解。 第二章 简单样例,了解如何用。 第三章 从源码来看底层实现机制。 第四章 实例测试验证。 第五章 总结提高。 个人能力有限,有任何不当之处,麻烦指出。 全文基于Mysql innodb引擎。Mysql官方文档: 官网飞机票 ,推荐书籍: 《Mysql技术内幕-InnoDB存储引擎》。 一、背景 1.1 拜神 spring事务领头人叫Juergen Hoeller,于尔根·糊了...先混个脸熟哈,他写了几乎全部的spring事务代码。读源码先拜神,掌握他的源码的风格,读起来会通畅很多。最后一节咱们总结下这个大神的代码风格。 1.2 事务的定义 事务(Transaction)是数据库区别于文件系统的重要特性之一。目前国际认可的数据库设计原则是ACID特性,用以保证数据库事务的正确执行

MySQL备份策略

走远了吗. 提交于 2020-08-17 12:52:46
1 关于备份 1.1 为什么要备份 灾难恢复 ,数据库在运行过程中,终会遇到各种各样的问题: 硬件故障、Bug 导致数据损坏、由于服务器宕机或者其他原因造成的数据库不可用。除此以外还有人为操作: DELETE 语句忘加条件、 ALTER TABLE 执行错表、 DROP TABLE 执行错表、黑客攻击,即使这些问题你都还没遇到,但是根据墨菲定律,总会有遇上的时候。 回滚 ,由于某种Bug或系统被黑造成大量的损失,这个时候就需要回滚到某个状态。常见的有区块链交易所被黑然后回滚,游戏漏洞被利用然后整体回滚。 审计 ,有时候有这样的需求:需要知道某一个时间点的数据是怎么样的,可能是年末审计,也可能是因为官司。 测试 ,一个基本的测试需求是,定时拉取线上数据到测试环境,如果有备份,就可以非常方便地拉取数据。 1.2 有哪些备份方式 1.2.1 逻辑备份 逻辑备份是最常见的方式,在数据量比较少的时候很常用。 逻辑备份的优势: 备份恢复比较简单,例如 mysqldump 就是 MySQL 自带的备份工作,无需额外安装。恢复的时候可以直接使用 mysql 命令进行恢复。 可以远程备份和恢复,也就是说,可以在其他机器执行备份命令。 备份出来的数据非常直观,备份出来后,可以使用 sed grep 等工具进行数据提取或者修改。 与存储引擎无关,因为备份文件是直接从 MySQL 里面提取出来的数据

MySQL精华大全

狂风中的少年 提交于 2020-08-17 12:38:57
数据库:按照数据结构组织,存储和管理数据的仓库,是一个长期存储在计算机内的,有组织的,可共享的,统一管理的大量数据的集合。 MySQL是关系型数据库管理系统(表格组,表与表之间通过主键与外键建立关系)。 首先从MySQL数据类型说起: 一. 1.数据型 TINYINT 有符号:-128到127 无符号:0-255 所占字节1 SMALLINT 有符号:-32768到32767 无符号:0-65535 所占字节2 MEDIUMINT 有符号:-2^23 到 2^23 -1 无符号:2^24 所占字节3 INT 有符号:-2^31 到 2^31 -1 注释:11位 无符号:2^32 -1 所占字节4 BIGYINT 有符号:-2 63到2 63-1 无符号:2^64 -1 所占字节8 BOOLEAN 相当于TINYINT(1) 0为FALSE 1为TRUE 字节1 FLOAT[(M,D)]:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) DOUBLE[(M,D)]:双精度实型,含字节数为8,64bit,数值范围-1.7E308~1.7E308(15个有效位) DECIMAL[(M,D)]:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位) 注释:MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示