JavaEE

138节课程 10人已学
第1章  事务
1.1

什么是事务?事务常见的并发问题及含义
第2章  linux
2.1

Linux查看进程的命令
第3章  javaweb
3.1

常见的http返回状态码(200,301,302,400)
3.2

token校验的过程?
3.3

JSon字符串怎样转换成对象
3.4

获取html文本域的内容有几种方式 写出所有你知道的
3.5

Jsp和servlet的关系
3.6

web项目常见攻击方式,并说明如何防御攻击?
3.7

Ajax如何解决跨域问题
3.8

ajax的参数都有啥?
3.9

jquery如何获取值?
3.10

js中,id和name的区别?
3.11

转发和重定向区别?
3.12

分别说出http,https,ftp,talnet的默认端口
3.13

ajax提交请求 默认是异步还是同步怎么改成同步?
3.14

TCP和UDP区别,你对HTTP协议的理解
3.15

如何防止表单重复提交问题
3.16

你的项目中使用过那些JSTL标签?
3.17

JSP四大作用域及请求范围
3.18

JSP的九大内置对象及作用分别是什么?
3.19

servlet的生命周期及常用方法?
3.20

ajax书写方式及内部主要参数都有哪些?
3.21

json数据的格式是什么?
第4章  redis
4.1

你觉得分布式开发的缺点是什么?
4.2

redis为什么可以做缓存?
4.3

广告数据是怎么用redis缓存的?
4.4

redis缓存与数据库同步,怎么做的?
第5章  spring
5.1

spring动态代理,生命周期?
5.2

使用spring 框架的好处是什么
5.3

对于IOC AOP的理解
5.4

Spring框架中缓存体系如何使用?
5.5

Spring 是如何管理事务的,事务管理机制?以及隔离级别?
5.6

拦截器和过滤器区别
第6章  nginx
6.1

负载均衡
第7章  zookeeper
7.1

zookeeper是如何保证事务的顺序一致性的
7.2

zookeeper是如何选取主leader的?
第8章  Java基础
8.1

HashMap的特性
8.2

Hashcode的作用
8.3

String s = new String(xyz);创建了几个String Object?
8.4

exception和error的区别是什么?他们的基类是?
8.5

谈谈你对Java虚拟机中的内存模型的理解(线程内存空间)
8.6

谈谈你对垃圾回收机制的了解?
8.7

支付接口是怎么做的?
8.8

线程Thread有几种状态
8.9

java支持多继承吗
8.10

接口和抽象类的区别是什么?
8.11

intager的valueof()和parent()区别?
8.12

基本数据类型有哪些?String是最基本的数据类型吗?是否可以继承?为什么?
8.13

Java虚拟机中的内存模型
8.14

String,StringBuilder,StringBuffer三者的区别
8.15

多线程解决同步问题的方式?
8.16

动态代理的2种方式以及区别?
8.17

Sleep和wait的区别
8.18

实现一个线程有哪几种方式各有什么优缺点比较常用的是那种?
8.19

String s = Hello;s = s + world!;这两行代码执行后,原始的String对象中的内容到底变了没有?
8.20

String s = new String(xyz);创建了几个StringObject?是否可以继承String类?
8.21

Hashtable 与 HashMap 有什么不同之处?
8.22

6、类加载机制有了解嘛?
8.23

是否可以从一个static方法内部发出对非static方法的调用?
8.24

遍历map的几种方法?
8.25

在HTTP请求中,什么情况下我们会选择post方式而非get?反之也是如何考虑的?
8.26

创建线程的几种方式?
8.27

简单说说Java中的异常处理机制的简单原理和应用。
8.28

说说HashCode()、equals()的区别?
8.29

请写出面向对象的三个基本特征
8.30

用最有效率的方法计算2*8
8.31

字符串的拼接有几种方式?
8.32

java虚拟机内存有那几个区域,简要描述各个区域
8.33

equal方法需要满足那几个特性?如何实现高质量的equals方法
8.34

一个数组如何找到和为K的两个数
8.35

快速排序过程,复杂度 什么情况下不使用?
8.36

JAVA8的新特性有哪些
8.37

什么是线程安全,如何保证线程安全
8.38

HashTable Hashmap ConcurrentHashMap的区别是什么
8.39

GC分哪几个代?他们的容量比例关系
8.40

您在项目中遇到过哪些与GC相关的问题,怎么解决他们的?
8.41

有哪几种线程池,请介绍线程池底层实现中比较重要的参数
8.42

解释一下,synchronized关键字的用途
8.43

链表的结构特点
8.44

如何判断一个字符串是否是回文字符串
8.45

TCP协议
8.46

给定一个HashMap 将Key 和 Value对换
8.47

IO和NIO的区别,NIO优点
8.48

Spring的IOC容器实现原理,为什么可以通过byName和ByType找到Bean
8.49

Object有哪些公用方法
8.50

Java程序的编译过程
8.51

Map、Set、List、Queue、Stack的特点与用法
8.52

Override和Overload的含义区别
8.53

怎样强制对一个对象进行垃圾回收
8.54

简要说下final在编程中是如何使用的
8.55

简要说明Java中的权限修饰符 public private protect
8.56

什么是线程安全的?请举例说明下
8.57

什么是线程池 ,线程池有什么好处?
8.58

equals和==的区别是
8.59

反射的原理,反射创建类实例的三种方式是什么
8.60

反射中,Class.forName 和 ClassLoader 区别
8.61

垃圾回收算法的实现原理
8.62

有一人有240公斤水,他想运往干旱地区赚钱。他每次最多携带60公斤,并且每前进一公里续耗水1公斤(均匀耗水)。假设水的价格在出发地为0,以后,与运输路程成正比,(即在10公里处为10元/公斤,在20公里处为20元/公斤......),又假设他必须安全返回,请问,他最多可赚多少钱?
8.63

写代码实现sort方法逻辑,让输出结果值能从小到大排序
8.64

数组有没有length()这个方法?String有没有length()这个方法?
8.65

连接池的说出数据工作机制是什么?
8.66

什么是低耦合和高聚合?封装原则又是什么意思?
8.67

写一个单例模式
8.68

java中的conllection和collections的区别
8.69

java中的如何遍历map对象的
8.70

Listis=newList()这个语法对吗?并说出理由
8.71

Char型变量能否存储一个中文字,为什么
8.72

多线程的实现方法有几种,分别是什么
8.73

Java中实现多态有哪些方式
8.74

在java中switch后的表达式的类型有哪几种
第9章  算法
9.1

用程序编写冒泡排序算法
9.2

写一个冒泡算法的排序
第10章  面向对象
10.1

说说你比较熟悉的设计模式及应用场景?
第11章  MyBatis
11.1

Mybatis的执行过程分析
11.2

mybatis和hibernate之间的优缺点比较?
11.3

MyBatis中使用#和$书写占位符有什么区别?
11.4

Mybatis中Mapper动态代理规范是什么?
第12章  SpringMVC
12.1

SpringMVC的工作流程?
12.2

简单介绍下spring MVC和struts2的区别有哪些?
12.3

springmvc前端控制器是什么?处理器映射器是什么?
12.4

Springmvc如何进行参数绑定?
12.5

springmvc获取表单数据的几种方式?
第13章  Dubbo
13.1

dubbo服务开发流程,运行流程?
第14章  框架
14.1

项目中权限是怎么做的?
14.2

fastDFS的执行流程,你清楚么?
14.3

日志文件的管理,你们是怎么做的?
14.4

单点登录系统是怎么做的?
14.5

Jquery常用选择器都有哪些?
14.6

activeMQ如果数据提交不成功怎么办?
14.7

solr跟数据库的区别,你清楚么?
14.8

solr怎么设置搜索结果排名靠前(得分)?
14.9

如何处理activeMQ消息丢失的问题?
14.10

solr和数据库怎么交互的?
14.11

activeMQ在项目中如何应用的?
14.12

Hibernate有几种状态,这几种状态之间如何转换
14.13

Spring AOP的实现原理?
< 上一节
1.1什么是事务?事务常见的并发问题及含义
下一节 >

(1)问题分析:

考官主要相对于事务方面的考核,如什么是事务,事务都有哪些特性;事务并发问题如何解决;事务的隔离级别分别可以解决什么问题;jdbc,spring如何实现事务控制;事务的应用场景等。

2核心答案讲解:

事务是指逻辑上的一组操作,组成这组操作的一系列操作要么全部成功,要么一个都不做。因此,事务的结束有两种,当事务中的所有操作全部成功执行时,事务提交。如果其中一个操作失败,将发生回滚操作,撤消到事务开始时的状态。

事务常见并发问题:

丢失更新:撤消一个事务时,把其它事务已提交的更新的数据覆盖了。

脏读:一个事务读到另一个事务未提交的更新数据。

幻读:一个事务执行两次查询,但第二次查询比第一次查询多出了一些数据行。

不可重复读:一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据。

3问题扩展:

事务的特性:

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存

事务的隔离级别及可以解决什么问题:

Serializable (串行化) 8   可避免脏读、不可重复读、幻读的发生。但是效率最低

Repeatable read (可重复读) 4 可避免脏读、不可重复读的发生。(最常用的MySQL默认的级别就是4)

Read committed (读已提交) 2 可避免脏读的发生(Oracle默认)。

Read uncommitted (读未提交) 1  最低级别,任何情况都无法保证,但效率最高,最不安全。

怎样实现事务的隔离呢?

隔离机制的实现必须使用锁。

锁的基本原理

a.当一个事务访问某个数据库资源时,如果执行的是select语句,必须为资源加上共享锁,如果执行的是insert,update,delete语句,必须为资源加上排他锁,这些锁锁定正在被操作的资源。

b.当第二个事务也要反问相同的资源时,如果执行的select语句,那么也必须为资源加上共享锁;如果执行的是insert,update,或delete语句,也必须为资源加上排他锁。但此时第二个事务并非就立即能为资源加上锁,当第一个事务为资源加的是共享锁时,第二个事务能够为资源加上共享锁,但当第一个事务为资源加的是排他锁时,第二个事务必须等待第一个事务结束,才能为资源加上排他锁。

1)共享锁(s锁)

共享锁用于读取数据操作,它允许其他事务同时读取锁定的资源,但不允许其他事务更新它。

2)排他锁(X锁)

排他锁用于修改数据的场合,他锁定的资源,其他事务部能读取也不能修改。

3)更新锁(U锁)

更新锁在更新操作初始化截断用来锁定可能要被修改的资源,从而避免使用共享锁造成的死锁现象。

 

表锁(table lock)

表锁是MySQL中最基本的锁策略,并且是开销最小的策略。表锁会锁定整张表。一个用户在对表进行写操作(插入、删除、更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。当没有写锁时,其他读取的用户才能获得读锁,读锁之间是不相互阻塞的。

 

行级锁(row lock)

行级锁可以最大程度地支持并发处理(同时也带来了最大的锁开销)。在InnoDB和XtraDB,以及其他一些存储引擎中实现了行级锁。行级锁只在存储引擎层实现,而MySQL服务器层没有实现。服务器层完全不了解存储引擎中的锁实现。

 

一次封锁or两段锁?

因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。

数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)

 

加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。

 

解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。

 

悲观锁

悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。悲观锁会完成以下功能:锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束.悲观锁是在使用了数据库的事务隔离功能的基础上,独享占用的资源,以此保证读取数据一致性,避免修改丢失。悲观锁可以使用Repeatable Read事务,它完全满足悲观锁的要求。

 

乐观锁

乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。如果使用乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

4结合项目中使用:

spring 的声明式事务:使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。

评论( 0
我要评论

还可以上传7

表情
  • QQ扫码
  • 微信扫码