一、数据库事务是什么,什么情况下使用事务,怎样的情况下产生死锁
(1)数据库事务
事务是并发控制的基本单位,所谓事务(单个逻辑工作单元执行的一系列操作(SQL语句)),它是一个操作序列,要么完全的执行,要么完全地不执行。
(2)、什么情况下使用事务
在银行金融领域,特别是涉及金钱的,这得使用事务,设计金额 方便 或对数据准确性要求特稿 并且是多表才需要事务
(3)、什么情况下产生死锁
事务A需要先查询数据1,然后修改数据2;
事务B需要先查询数据2,然后修改数据1;
此时2个事务并发执行,由于mysql innodb的默认隔离级别是可重复读,读锁、写锁只能在事务结束才会释放。
事务A中需要等待事务B释放数据2的共享锁,才能执行对数据2添加排他锁;事务B需要等待事务A释放数据1的共享锁,才能执行对数据1添加排他锁。这样会就出现事务死锁
这种死锁在oracle中就不会出现,因为oracle的默认隔离级别是读已提交,共享锁在执行完查询之后就会释放,不会导致排他锁无法添加的问题。
二、MySql查询分页
select * from table limit 0,5;
三、二维数组排序
private static double [][] sortRows(double[][] nPrint) {//行排序 for (int i = 0; i < nPrint.length; i++) { Arrays.sort(nPrint[i]); } return nPrint; }
private static double [][] sortColumn(double[][] nPrint) {//列排序
double [][] a = new double[3][3];
for (int i = 0; i < nPrint.length; i++) {
for (int j = 0; j < a.length; j++) {
a[i][j] = nPrint[j][i];
}
}
for (int j = 0; j < a.length; j++) {
Arrays.sort(a[j]);
}
for (int i = 0; i < nPrint.length; i++) {
for (int j = 0; j < a.length; j++) {
nPrint[i][j] = a[j][i];
}
}
return nPrint;
}
四、打印杨辉三角形
/采用一个二维数组打印杨辉三角 2 class Yanghui1 { 3 public static void main(String[] args) 4 { 5 //设置杨辉三角的行数 6 int num = 10; 7 8 //申请二维数组存放杨辉三角数值 9 int[][] yangHui = new int [num][]; 10 for(int i = 0; i < yangHui.length; i ++) 11 yangHui[i] = new int[i + 1]; 12 13 //利用杨辉三角的计算公式,初始化数组 14 for(int i = 0; i < yangHui.length; i ++) 15 for(int j = 0; j < yangHui[i].length; j ++) 16 { 17 //每一行第一个数和最后一个数都为1 18 yangHui[i][0] = yangHui[i][i] = 1; 19 20 if(i > 1 && j > 0 && j < i) 21 //杨辉三角的值等于其上一层两个值之和 22 yangHui[i][j] = yangHui[i - 1][j] + yangHui[i -1][j -1]; 23 } 24 25 //遍历数组,以输出 26 for(int i = 0; i < yangHui.length; i ++) 27 { 28 for(int j = 0; j < (num - i - 1) / 2; j ++) 29 System.out.print("\t"); 30 for(int j = 0; j < yangHui[i].length; j ++) 31 System.out.print(yangHui[i][j] + "\t"); 32 33 System.out.println(); 34 } 35 } 36 37 } 38 39 //采用两个一维数组打印杨辉三角 40 class YangHui2 41 { 42 public static void main(String[] args) 43 { 44 int num = 20; 45 46 //申请UP数组用以存储上一层的数据 47 int[] up = new int[num]; 48 for(int i = 0; i <= num; i ++) 49 { 50 //申请a数组用以存放本层的运算结果 51 int[] a = new int[i]; 52 for(int j = 0; j < i; j ++) 53 { 54 //将本层第一个和最后一个数值赋值为1 55 if(j == 0 || j == i) 56 a[j] = up[j] = 1; 57 58 //当从第三行起,非首尾数字的值等于上方两数只和 59 if(i > 2 && j !=0 && j != i ) 60 a[j] = up[j - 1] + up[j]; 61 } 62 63 //将本层的运算结果存到up数组中,以供一下次运算使用 64 for(int k = 0; k < i; k ++) 65 up[k] = a[k]; 66 67 //打印本层数字 68 for(int k = 0; k < (num - i - 1) / 2; k ++) 69 System.out.print("\t"); 70 for(int k = 0; k < i; k ++) 71 System.out.print(a[k] + "\t"); 72 73 System.out.println(); 74 } 75 } 76 } 77 78 //采用一个一维数组打印杨辉三角 79 class YangHui3 80 { 81 public static void main(String[] args) 82 { 83 int num = 10; 84 85 //申请数组存放杨辉三角的数值 86 int yangHui[] = new int[(1 + num) * num / 2]; 87 for(int i = 0; i < num; i ++) 88 { 89 for(int j = 0; j < (num - i - 1) / 2; j ++) 90 System.out.print("\t"); 91 92 //temp表示已经存储的数字个数 93 int temp = (1 + i) * i / 2; 94 for(int j = 0; j <= i; j ++) 95 { 96 //每一层的首尾数值为1 97 if(j == 0 || j == i) 98 yangHui[temp + j] = 1; 99 100 else 101 //非首尾数值为上面两数之和 102 yangHui[temp + j] = yangHui[temp + j - i] + yangHui[temp + j - i - 1]; 103 System.out.print(yangHui[temp + j] + "\t"); 104 } 105 } 106 System.out.println(); 107 } 108 }
六、对于三百万数据量,怎样提高查询效率
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3、缓存,已查过的放内存,没查过的才查
4、 并行,可以多线程/多进程甚至分布式
5、分离读写,使用数据仓库,专门面对查询
七、输入年月日,求一年的第几天
// 实例化Scanner Scanner scan = new Scanner(System.in); // 声明年份,月份,日期 int year, month, day; // 提示用户输入年份 System.out.println("请输入年份:"); // 接受用户输入的年份 year = scan.nextInt(); // 提示用户输入月份 System.out.println("请输入月份:"); // 接受用户输入的月份 month = scan.nextInt(); // 提示用户输入日期 System.out.println("请输入日期:"); // 接受用户输入的日期 day = scan.nextInt(); // 判断月份(注意break位置) switch (month - 1) { case 11: // 日期加上11月的全天数 day += 30; case 10: // 日期加上10月的全天数 day += 31; case 9: // 日期加上9月的全天数 day += 30; case 8: // 日期加上8月的全天数 day += 31; case 7: // 日期加上7月的全天数 day += 31; case 6: // 日期加上6月的全天数 day += 30; case 5: // 日期加上5月的全天数 day += 31; case 4: // 日期加上4月的全天数 day += 30; case 3: // 日期加上3月的全天数 day += 31; case 2: /* * 日期加上2月的全天数 * 闰年判断 */ if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {// 是 // 天数加29 day += 29; } else {// 不是 // 天数加28 day += 28; } case 1: //日期加上1月的全天数 day += 31; default: // 错误提示 System.out.println("请输入正确月份"); break; } // 判断月份是否有误 if(month >= 1 && month <= 12){ // 打印判断结果 System.out.println("今天是" + year + "年的第" + day + "天"); } 原文:https://blog.csdn.net/qq_38652288/article/details/84553033