select...for update

作用:

select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性.
该语句用来锁定特定的行(如果有where子句,就是满足where条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改或删除这些行,直到该语句的事务被commit语句或rollback语句结束为止。

for update的使用场景

如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。

比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。

  • 记住一个原则:一锁二判三更新
阅读更多

图 DFS

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import java.util.Stack;

public class Graph {

class Vertex{ //顶点
public char lebel;
public boolean visited;
public Vertex(char lab){
lebel = lab;
visited = false;
}
}

private final int maxVertices = 20 ; //最大顶点数
private Vertex vertexList[];
private int adjMatrix[][];
private int vertexCount;
private Stack theStack;

public Graph(){
vertexList = new Vertex[maxVertices];
adjMatrix = new int[maxVertices][maxVertices];
vertexCount = 0;
for(int y = 0 ; y < maxVertices ; y++){
for(int x = 0 ; x < maxVertices ; x ++){
adjMatrix[x][y] = 0;
}
}
theStack = new Stack();
}

public void addVertex(char lab){
vertexList[vertexCount++]=new Vertex(lab);
}

public void addEdge(int start,int end){
adjMatrix[start][end] = 1;
adjMatrix[end][start] = 1;
}

public void displayVertex(int v){
System.out.println(vertexList[v].lebel);
}

public void dfs(){
vertexList[0].visited = true;
displayVertex(0);
theStack.push(0);
while (!theStack.isEmpty()){
int v = getAdjUnvisitedVertes((int)theStack.peek());
if(v == -1){
theStack.pop();
}else {
vertexList[v].visited = true;
displayVertex(v);
theStack.push(v);
}
}
for(int j = 0 ; j < vertexCount; j++){
vertexList[j].visited = false;
}
}

public int getAdjUnvisitedVertes(int v){
for(int j = 0 ; j < vertexCount ; j ++){
if(adjMatrix[v][j] == 1 && vertexList[j].visited == false){
return j;
}
}
return -1;
}

public static void main(String[] args) {
int col = 9 ;
int[][] a = new int[col][col];
a[0][1] = 1;a[0][5] = 1;a[1][2] = 1;a[1][6]= 1;a[1][8]= 1;
a[2][3] = 1; a[2][8] = 1;
a[3][8] =1; a[3][6]= 1; a[3][7] = 1;a[3][4] = 1;
a[4][5] =1; a[4][7]= 1; a[5][6] = 1;a[6][7] = 1;

Graph graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.addVertex('E');
graph.addVertex('F');
graph.addVertex('G');
graph.addVertex('H');
graph.addVertex('I');
for(int y = 0 ; y < col; y ++){
for(int x = 0 ; x < col ; x ++ ){
if(a[y][x] == 1){
graph.addEdge(y,x);
}
}
}
graph.dfs();

}

}

java 多态 Polymorphic

简述

多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。
多态的特性就是,运行期才能动态决定调用的子类方法。对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法

多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。用白话来说,就是多个对象调用同一个方法,得到不同的结果。

多态的语法格式

父类类名 引用名称 = new 子类类名();

当是多态时,该引用名称只能访问父类中的属性和方法,但是访问的时候,会优先访问子类重写以后的方法。

阅读更多

java 泛型 Generics

简述

泛型就是定义一种模板,例如ArrayList,然后在代码中为用到的类创建对应的ArrayList<类型>:

1
2
3
4
5
6
7
public class ArrayList<T> {
private T[] array;
private int size;
public void add(T e) {...}
public void remove(int index) {...}
public T get(int index) {...}
}

T可以是任何class。这样一来,我们就实现了:编写一次模版,可以创建任意类型的ArrayList:

阅读更多

Fibonacci

斐波那契数列

大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。

输入:
4
返回值:
3

说明:
根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。

阅读更多

BM4 合并两个排序的链表

描述

输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
img.png
输入:
{1,3,5},{2,4,6}

返回值:
{1,2,3,4,5,6}

阅读更多

二维数组中的查找

描述

在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

1
2
3
4
5
6
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]

给定 target = 7,返回 true。

给定 target = 3,返回 false。

数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足 0 ≤val≤10^9

进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)

示例1
输入:
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:
true
说明:
存在7,返回true

示例2
输入:
1,[[2]]
返回值:
false

示例3

输入:
3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:
false

说明:
不存在3,返回false

阅读更多