数据库主键

mysql 加锁处理分析

岁酱吖の 提交于 2019-11-29 08:13:53
转载 http://blog.csdn.net/opensure/article/details/46227695 MySQL 加锁处理分析 标签: Database Deadlock Lock MySQL 2015-05-29 11:14 1101人阅读 评论 (0) 收藏 举报 分类: mysql(1) 目录 (?) [+] 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL /InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时

MySQL 加锁处理分析

筅森魡賤 提交于 2019-11-29 08:13:34
链接地址: http://hedengcheng.com/?p=771 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景

MySQL 加锁处理分析

荒凉一梦 提交于 2019-11-29 08:13:19
MySQL 加锁处理分析 http://hedengcheng.com/?p=771 MySQL 加锁处理分析 1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到 MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思 路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁

写给 Java 程序员的 24 个MySQL面试题,拿走不谢!

核能气质少年 提交于 2019-11-29 08:09:48
一、为什么用自增列作为主键?   1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引。   如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引。   如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。   2、数据记录本身被存于主索引(一颗B+Tree)的叶子节点上,这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放   因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)   3、如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页   4、如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置   此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销   同时频繁的移动、分页操作造成了大量的碎片

数据库设计的三大范式2

筅森魡賤 提交于 2019-11-29 04:42:50
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。 在实际开发中最为常见的设计范式有三个: 1 .第一范式 第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。 用户信息表 编号 姓名 性别 年龄 联系电话 省份 城市 详细地址 1 张红欣 男 26 0378-23459876 河南 开封 朝阳区新华路23号 2 李四平 女 32 0751-65432584 广州 广东 白云区天明路148号 3 刘志国 男 21 0371-87659852 河南 郑州 二七区大学路198号 4 郭小明 女 27 0371-62556789 河南 郑州 新郑市薛店北街218号 上表所示的用户信息遵循了第一范式的要求

mysql-约束概览

本小妞迷上赌 提交于 2019-11-29 03:51:45
目录 约束 什么是约束 (constraint) mysql中的约束 unique (唯一) not null (非空) null default primary key 约束 什么是约束 (constraint) 约束就是一种限制, 数据库的约束,是对数据的安全性,完整性的保证; mysql中的约束 unique (唯一) 唯一性约束,表示这个字段不能出现重复的值,用于唯一标识一条记录 主要用于:身份证,学号等 not null (非空) 非空约束,表示这个字段的值不能为空 主要用于: 账户名/密码 null 一些数据类型默认就是可以为空 default 默认值,用于给某一字段设置默认值 普通约束例子: # 完整的建表语句 create table 表名(字段名 字段类型[(宽度)约束]) charset utf8; # 学生类(类型具备:学号/姓名/性别) create table student( id int unique, name char(10) not null, gender enum("women","man") default "man" ); insert into student values(null,null,null); # 因为name约束了不能为空,所以会报错 ERROR 1048 (23000): Column 'name' cannot be

数据库主键和索引关联

空扰寡人 提交于 2019-11-29 03:30:14
一直以来不能够分清主键和索引的关系,在此梳理以备不时之需 1、主键   主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。   主键主要作用:1、惟一地标识一行。 2、作为一个可以被外键有效引用的对象。 2、索引   包含着对数据表里所有记录的引用指针。 区别:    一个表中可以有多个唯一性索引,但只能有一个主键。   主键列不允许空值,而唯一性索引列允许空值。    主键一定是唯一性索引,唯一性索引并不一定就是主键。 联系:   主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。   其实主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是主键不实际存在,而索引实际存在在数据库中,主键一般都要建,主要是用来避免一张表中有相同的记录,索引一般可以不建,但如果需要对该表进行查询操作,则最好建,这样可以加快检索的速度。 注:通俗的说主键是一本书的页码,索引是一本书的目录。 参考: https://www.cnblogs.com/ybygb-geng/p/9574169.html 来源: https://www.cnblogs.com/51python/p/11443540.html

JPA主键生成器和主键生成策略

≡放荡痞女 提交于 2019-11-29 02:33:09
JPA中创建实体时,需要声明实体的主键及其主键生成策略。我们有一个实体类叫做Email,其主键上声明如下: @Id @Column(name = "EMAIL_ID") @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "emailSeq") @SequenceGenerator(initialValue = 1, name = "emailSeq", sequenceName = "EMAIL_SEQUENCE") private long id; 我们使用@GeneratedValue的strategry字段声明主键生成策略,generator声明主键生成器的名称,对应于同名的主键生成器@SequenceGenerator或者@TableGenerator。 与Hibernate不同,JPA只提供四种主键生成器策略,分别介绍如下: GenerationType.IDENTITY 多数数据库支持IDENTITY列,数据库会在新行插入时自动给ID赋值,这也叫做ID自增长列,比如MySQL中可以在创建表时声明“AUTO_INCREMENT”, 就是一个ID子增长列: CREATETABLE EMAIL{ ID BIGINT NOT NULL AUTO_INCREMENT, MESSAGE VARCHAR

SQL查询--约束

江枫思渺然 提交于 2019-11-29 01:41:28
在慕课网上学习时记的关于oracle中约束概念的基础笔记,当初一直对约束的概念不清不楚的,所以找了些资料来看 约束是数据库用来确保数据满足业务规则的手段 约束的作用:定义规则、确保完整性 1.非空约束 非空约束作用的列也叫强制列。顾名思义,强制键列中必须有值 创建表时设置非空约束 create table table_name ( column_name datatype not null, ... ) 如下 修改表时添加非空约束 alter table table_name modify column_name datatype not null; 注意:在设置非空约束之前,表中不应该有数据 修改表时去除非空约束 alter table table_name modify column_name datattype null; 2.主键约束: 确保表中每一行数据的唯一性(设置了主键约束的字段,要求这个字段是 非空的+唯一的) 所以如果一个字段被设置为主键,则查看表结构时,会发现这个字段为非空,即 NOT NULL; 一张表只能设计一个主键约束,但是主键约束可以由多个字段构成(联合主键或复合主键) 在创建表时设置主键约束 方式一: create table table_name( column_name datatype PRIMARY KEY,... ); 如下 方式二:

Hibernate(二)——POJO对象的操作

末鹿安然 提交于 2019-11-28 23:58:26
POJO 对象其实就是我们的实体,这篇博客总结一下框架对 POJO 对象对应数据库主键的生成策略,和一些对 POJO 对象的简单增删改查的操作。   一, Hibernate 框架中主键的生成策略有三种方式:    1 ,数据库负责生成主键(代理主键)      a,native: 表示由设置的方言决定采用什么数据库生成主键方式,例如:在 MySQL 中会采用自增长的方式,主键字段必须都是整形类型;在 Oracle 数据库中,会采用序列的增长方式。      b,sequence: 表示采用数据库的序列生成主键,适用于 Oracle , DB2 数据库中。      c,identity: 表示采用自增长的主键生成方式,适用于 MySQL,SQL Server 中。   2 , Hibernate 框架负责生成主键值(代理主键):      a,increment: 表示由框架本身提供计数器,累加数据,获取主键。     b,uuid: 由框架根据参数( IP 地址, JVM 虚拟机启动时间,系统时间,计数器等)生成 32 位 16 进制的数字字符串。   3 ,用户提供主键值(自然主键):     Assigned: 业务(自己)提供主键。   当然这里常用的是 native,uuid 和 Assigned 三值。在设置 POJO 类与表映射时,进行主键设置,标签为 <id>