Wiky's Blog

Easy coding,easy life.


  • 首页

  • 关于

  • 归档

  • 标签

  • 分类
Wiky's Blog

MySQL事务隔离级别及脏读及不可重复读和幻读的理解

发表于 2017-10-20   |   热度  °C   |   WordCount: 字

##事务
事务:一组原子性的SQL语句;要么全部执行,要么全部不执行(中途语句出现错误会回滚);
一个运行良好的事务处理系统要遵循CAID原则:
C(consistency)一致性:数据库会从一个一致性状态转换成另一个一致性状态;
A(atomicity)原子性:事务是一个最小的不可分割的单元,要么全部执行要么全部不执行;
I(isolation)隔离性:一个事务所做的修改未提交之前,其他事务不可见;
D(durability)持久性:一个事务所做的修改,会永久保存到数据库中。

###隔离性=》隔离级别
SQL标准里面定义了四种隔离级别:
1.READ UNCOMMIT(未提交可读):该事物未提交的修改可以在其他事务可见;
产生脏读:读取到了未提交的数据;
2.READ COMMIT(提交可读):一个事务开始时,只能看见已经提交的修改;
虚读:两次查询会因为其他事务修改了表中的数据而变得结果不一致的情况,也叫不可重复读;
3.REPEATABLE READ(可重复读):保证同一事务读取同样的记录结果是一致的;
无法避免幻读:当前事务读取某个范围的记录时,另一个事务在该范围内插入了新的记录,当前事务再次读取该范围的记录时,会产生幻行;
4.SERILIZABLE(可串行化):强制事务串行执行;

###死锁
出现的原因:
一个事务更新第x行(行锁产生)及第y行数据,另一个事务更新第y行(行锁产生)数据及第x行数据,两个事务都会因为等待锁的释放而产生死锁。

注:事务回滚涉及到不支持事务的引擎创建的表的语句时,不会回滚其语句,也不会给出提示。

###隐式锁显示锁
InnoDB引擎采用两个阶段锁定协议;锁早事务COMMIT和ROLLBACK之后才会释放。
INNoDB也支持显式加锁:LOCK IN SHARE MODE;

##多版本并发(complicated)控制MVCC:
一般会实现非阻塞的读以及写操作只锁定必要的行;分乐观和悲观并发控制;
InNoDB的MVVC实现P12:增加额外的两个行;
数据库引擎考虑的因素:
1.事务:需要事务支持选择InNoDB;不需要事务,主要是INSERT和SELECT操作,选择MyIASM;
2.备份:在线热备份,选择InNoDB;
3.崩溃恢复:首选InNoDB;4.其他特性:

###日志型应用
对插入的要求较高,选择MyISAM比较合适;

Wiky's Blog

MySQL数据类型选择

发表于 2017-10-20   |   热度  °C   |   WordCount: 字

##数据库类型选择
1.选择正确的存储数据的最小数据类型:
2.简单就好:整型比字符操作代价更低,主要是字符集和校对规则(排序规则)使字符比整型比较更加复杂;
两个特例:存储日期类使用内建的类型,要整型存储ip地址;
3.尽量避免NULL:
4.timesamp比datetime少一半的存储空间,允许的范围也更加的小;

###整数类型
TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位进行存储。

###实数类型
double占用8个字节,MySQL将其作为内部计算的类型;
decimal在需要进行精确计算时才使用。数据量比较大时,考虑BIGINT代替DECIMAL;以避免浮点存储计算不精确级DECIMAL精确计算代价高的问题。

###字符串类型
VARCHAR存储可变长字符串。需要额外的一到两个字节记录字符串长度(长度小于255个字节,用一个字节表示)。
CHAR是定长的,会更具需要采用空格进行填充以方便比较。例如CHAR适合存储密码的MD5值,这是一个定长的值。
注:每个字符最坏使用3个字节。

###BLOB和TEXT类型
为存储很大的数据而设计的字符串类型数据,分别采用二进制和字符方式存储;

###日期和时间类型
DATETIME:保存范围扼杀从1001到9999年,精度为秒,八个字节的存储空间。
TIMESTAMP:从1970年1月1日午夜到2038年,与Unix时间戳相同。

##乐观锁和悲观锁

###悲观锁:从数据开始更新就将数据锁住,直到更新完成才释放。
eg:
select * from account where name=”Erica” for update
这个语句会锁住所有符合条件的记录。其他可以读取但是不能修改和删除这些行,直到该语句的事务回滚或者提交。
缺点:会造成加锁时间过长,特别是长事务。

###乐观锁:准备提交所做的修改到数据库的时候才会将数据锁住。
实现方式是1.数据库版本记录机制,在每行数据加一个字段版本号来控制的。
工作原理就是读出是也把版本号读出,更新时把版本号加一;
只有提交的版本号大于当前数据的版本号则更新,否则需要重新读取数据做出更改。
2.时间戳机制:这个比较的是等于,而不是大于。
缺点:不能解决脏读问题。

##权限语句和收回权限语句
grant 权限 on 数据库对象 to 用户
权限包括:insert select update delete;
收回:revoke

##索引
1.可以使用explain select from c;来显示查询的参数。
2.索引优化:
3.1.索引字段越小越好,数据库以页为存储单位,字段越小,存储的数据越多;
3.2.**
散列度大的列放在联合索引的前面,如何判断散列度:*
分别SELECT COUNT列得到数字越大,散列度越高。

3.3.
注意重复,冗余,无用索引。

###聚类和非聚类
根本的区别在于表中记录的顺序和索引的排列顺序是否一致的;
聚类索引:索引的叶节点就是数据节点。由于磁盘的空间优势在于范围查找会比较的快;
适用场合:某一列包含小数目的不同值;排序以及范围查找;
而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块;

涉及到的操作系统的知识:
我们先将计算机分为数个层次:
寄存器 64位
一级缓存L1 4×64KB
二级缓存L2 4×256KB
三级缓存L3 8MB
内存 4GB
磁盘 1TB
空间局部性+时间局部性;

###组合索引
Index(A,B,C):
不能使用上组合索引的情况:
不包括组合索引的首列字段;
排序是可用:
Index(A,B):
ORDER BY A;A=5 ORDER BY B;
ORDER BY A desc, B desc;(顺序相同);

Wiky's Blog

leetCode之数组专题

发表于 2017-10-17   |   热度  °C   |   WordCount: 字

数组专题之合并两个排序数组:合并两个已排序的数组

思路:从后往前放置两个数组的最右边的最大值,最后检查被放入数组是否为空,
依次放入放入数组(容易知道这些值都是比放入数组最左的数字小的数)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void merge(int[] nums1, int m, int[] nums2, int n) {
if (m == 0) {
for (int j = 0; j < nums2.length; j++) {
nums1[j] = nums2[j];
}
}
if (m > 0 && n > 0) {
int i = m - 1;
int j = n - 1;
int k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--];
} else {
nums1[k--] = nums2[j--];
}
}
while (j >= 0) {
nums1[k--] = nums2[j--];
}
}
}

阅读全文 »
Wiky's Blog

数据库MySQL总结

发表于 2017-09-26   |   热度  °C   |   WordCount: 字

说起来真是惭愧了,学了一个学期的数据库,对数据库的题目大大小小也写过一些了;然而在昨天的面试里面,
却在面对一道自己似曾相识的题目的时候,跟那个面试官出现了比较大的分歧;题目的需求大概是这样的:

阅读全文 »
Wiky's Blog

数据库入门之视图游标存储过程触发器

发表于 2017-09-26   |   热度  °C   |   WordCount: 字

数据库视图:
1.常用于把多表联结的数据保存在一个视图里面,可以重用SQL语句,保护数据等;
2.创建规则:命名唯一,不能有索引,可以和表一起使用,视图本身没有数据;
3.CREATE VIEW来创建,DROP VIEW来删除;
4.例子:把所有厂商的邮箱地址保存在一个视图;
CREATE VIEW emails123 AS
SELECT * FROM vendor WHERE e_mail IS NOT NULL;

SELECT * FROM emails123;
5.更大的用途在多个表联结得到的数据,重新格式化数据,比如给地址值加上横杠括号之类的;
6.更新视图更新的是原数据,有分组等语句不能更新;
SHOW CREATE VIEW emails1;—显示创建视图的语句;

阅读全文 »
Wiky's Blog

数据库入门之插入删除更新

发表于 2017-09-20   |   热度  °C   |   WordCount: 字

数据库数据插入:
1.插入完整的行
INSERT INTO product VALUES(‘5’,’2’,’r2’,500);—>不建议的写法
缺陷:高度依赖与表中的依赖次序,列的次序变动之后易出错;
改进:
INSERT INTO product(id,pct_name,vend_id,pct_price) VALUES(‘6’,’2’,’r2’,500);
可忽略的列:给出默认值或者允许为NULL;
提高整体性能:
INSERT操作可能会比较耗时,优先SELECT语句的做法:
INSERT LOW_PRIORITY INTO product(id,pct_name,vend_id,pct_price) VALUES(‘6’,’2’,’r2’,500);

2.插入多个行
INSERT LOW_PRIORITY INTO product(id,pct_name,vend_id,pct_price)
VALUES(‘6’,’2’,’r2’,500),(‘7’,’2’,’r2’,600);
注:单条INSERT语句处理多个插入,性能会比多个INSERT语句要快!

阅读全文 »
Wiky's Blog

Hello World

发表于 2017-09-15   |   热度  °C   |   WordCount: 字

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

Wiky's Blog

Java笔试面试常考常问题总结

发表于 2017-09-15   |   热度  °C   |   WordCount: 字

本来想着写一些笔试自己遇到的多数的坑,然而写着写着就想到了很多面试遇到的比较有意思的问题,在此特意总结一下,希望自己以后可以吃一暂长一智吧。
switch
1.switch支持的数据类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
byte bb=1;
char cc='测';
short ss=12;
int i=0;
long ll=12333L;
float f=1.3f;
double d=12.3;
boolean b1=true;
String string="123";
switch(bb){
}
switch(cc){
}
switch(ss){
}
switch(i){
}
//以下情况会编译报错
switch (ll){
}
switch(f){
}
switch(d){
}
switch(b1){
}
switch(string){
}

可以看到,Java的switch语句支持的数据类型包括8种数据类型中的4种(这四种不需要强制类型转换都能够转换成int类型),另外还支持String类型。不支持的基本数据类型有float,double,long,boolean。

阅读全文 »
Wiky's Blog

java与json相关

发表于 2017-09-11   |   热度  °C   |   WordCount: 字

现在前端的数据基本上都通过json来传输,不得不说,json比xml之类的文本格式好多了,能够最大程度的把数据展现给我们,不需要太拘泥于格式。
而对于Java后端程序员来说,我们也需要去调用其他域名(项目)的接口,而这个接口返回的数据是JSON格式,那么我们就需要把它转化成一个对象进行数据的处理;

Alibaba的fastjson

Fastjson介绍:
Fastjson是一个Java语言编写的JSON处理器,由阿里巴巴公司开发。遵循http://json.org标准,为其官方网站收录的参考实现之一。支持JDK的各种类型,包括基本的JavaBean、Collection、Map、Date、Enum、泛型。有如此好的轮子,所以可以使用上。
pom.xml加入依赖:

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.0.4</version>
</dependency>

好吧,阿里巴巴的东西确实蛮好的,看那些json文档以及阿里巴巴的github学习了好多fastjson的东西。恩,好好学习天天向上吧!!!

附上同性交友链接:
https://github.com/alibaba

Wiky's Blog

Springboot项目建立

发表于 2017-09-07   |   热度  °C   |   WordCount: 字

概要:

github链接:
https://github.com/wikyMr/LearnSpring;

在一番百度和前辈的指引下,我算是成功的把一个Spring boot项目搭建了起来;
不得不说,spring boot是一个非常方便的框架,大大简化了我们的开发,只需要一点点的配置,然后我们就可以建立起自己的项目了;

1.搭建maven项目

http://www.cnblogs.com/qinbb/articles/5762081.html

这个链接给出的搭建过程,可以简单的建立一个可以访问的应用;但是src/main/resource文件夹不见了,怎么也找不出来,而且新建一个文件夹也不可见。
网上的说法是可以新建Source Folder即可。

阅读全文 »
123
Wiky

Wiky

屏上得来不觉浅,甚要绝知此事要躬行

25 日志
10 标签
GitHub Weibo 知乎
© 本站总访问量次 本站访客数人次 2017 Wiky
由 Hexo 强力驱动
主题 - NexT.Muse