java面试题总结
中信銀行
1.Integer范圍問題
Integer a=100,b=100,c=200,d=200; System.out.println(a == b);//true System.out.println(c == d);//false?? Integer在-128~127之間會有緩存,在數(shù)字之間的地址值是一樣的,超過的會new出一個新的對象。
?
2.List如何求并集
List<String> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>();//并集 list2.removeAll(list1); list1.addAll(list2);//交集 list1.retainAll(list2);//差集 list1.removeAll(list2);?考點List集合類collections的一些方法
?
3.三個線程同時執(zhí)行,順序輸出ABC
public class TestThread1 {public static void main(String[] args) {// 線程Afinal Thread a = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("A");}});// 線程Bfinal Thread b = new Thread(new Runnable() {@Overridepublic void run() {try {// 執(zhí)行b線程之前,加入a線程,讓a線程執(zhí)行a.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("B");}});// 線程Cfinal Thread c = new Thread(new Runnable() {@Overridepublic void run() {try {// 執(zhí)行c線程之前,加入b線程,讓b線程執(zhí)行b.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("C");}});// 線程DThread d = new Thread(new Runnable() {@Overridepublic void run() {try {// 執(zhí)行d線程之前,加入c線程,讓c線程執(zhí)行c.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("D");}});// 啟動四個線程a.start();b.start();c.start();d.start();} }檢測線程狀態(tài)的變化 join
?
4.private long val;??? 屬性val的get set方法高并發(fā)下會不會有問題?如何處理。
public class Data {private int data;private ReadWriteLock lock = new ReentrantReadWriteLock();public void set(int data){lock.writeLock().lock(); //取到寫鎖try {System.out.println(Thread.currentThread().getName()+"準(zhǔn)備寫入數(shù)據(jù)!");try {Thread.sleep(0);}catch (InterruptedException e) {e.printStackTrace(); //打印異常信息}this.data = data;System.out.println(Thread.currentThread().getName()+"寫入"+this.data);}finally {lock.writeLock().unlock(); //釋放寫鎖!}}public void get(){lock.readLock().lock(); // 取到讀鎖!try {System.out.println(Thread.currentThread().getName()+"準(zhǔn)備讀取數(shù)據(jù)");try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace(); //打印異常}System.out.println(Thread.currentThread().getName()+"讀取數(shù)據(jù)!");}finally {lock.readLock().unlock(); //釋放讀鎖!}}}?
?
5.Collection和Collections區(qū)別
java.util.Collection 是一個集合接口(集合類的一個頂級接口)。其直接繼承接口有List與Set。
List特點:元素有放入順序,元素可重復(fù) ,Set特點:元素?zé)o放入順序,元素不可重復(fù),重復(fù)元素會覆蓋掉,(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的,加入Set?的Object必須定義equals()方法?,另外list支持for循環(huán),也就是通過下標(biāo)來遍歷,也可以用迭代器,但是set只能用迭代,因為他無序,無法用下標(biāo)來取得想要的值。
Set:檢索元素效率低下,刪除和插入效率高,插入和刪除不會引起元素位置改變。?
List:和數(shù)組類似,List可以動態(tài)增長,查找元素效率高,插入刪除元素效率低,因為會引起其他元素位置改變。?
LinkedList、ArrayList、HashSet是非線程安全的,Vector是線程安全的;
?
Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態(tài)方法,用于對集合中元素進行排序、搜索以及線程安全等各種操作。
混排算法所做的正好與 sort 相反: 它打亂在一個 List 中可能有的任何排列的蹤跡。也就是說,基于隨機源的輸入重排該 List, 這樣的排列具有相同的可能性(假設(shè)隨機源是公正的)。這個算法在實現(xiàn)一個碰運氣的游戲中是非常有用的。例如,它可被用來混排代表一副牌的 Card 對象的一個 List 。另外,在生成測試案例時,它也是十分有用的。Collections.Shuffling(list)
使用Reverse方法可以根據(jù)元素的自然順序 對指定列表按降序進行排序。
Collections.reverse(list)
使用指定元素替換指定列表中的所有元素。Collections.fill(li,"aaa");
……..
6.Springmvc spring boot區(qū)別,簡化了哪些地方
Spring MVC是基于 Servlet 的一個 MVC 框架 主要解決 WEB 開發(fā)的問題,因為 Spring 的配置非常復(fù)雜,各種XML、 JavaConfig處理起來比較繁瑣。于是為了簡化開發(fā)者的使用,從而創(chuàng)造性地推出了Spring boot,約定優(yōu)于配置,簡化了spring的配置流程。
Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應(yīng)用組件。大家覺得挺好用,于是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發(fā) web 應(yīng)用( SpringMVC )。然后有發(fā)現(xiàn)每次開發(fā)都寫很多樣板代碼,為了簡化工作流程,于是開發(fā)出了一些“懶人整合包”(starter),這套就是 Spring Boot。
7.Springboot核心注解?
7.1.@SpringBootApplication
用于Spring主類上最最最核心的注解,自動化配置文件,表示這是一個SpringBoot項目,用于開啟SpringBoot的各項能力。
相當(dāng)于@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解的組合。
7.2.@EnableAutoConfiguration
允許SpringBoot自動配置注解,開啟這個注解之后,SpringBoot就能根據(jù)當(dāng)前類路徑下的包或者類來配置Spring Bean。
例如:
當(dāng)前路徑下有MyBatis這個Jar包,MyBatisAutoConfiguration 注解就能根據(jù)相關(guān)參數(shù)來配置Mybatis的各個Spring Bean。
7.3.@Configuration
Spring 3.0添加的一個注解,用來代替applicationContext.xml配置文件,所有這個配置文件里面能做到的事情都可以通過這個注解所在的類來進行注冊。
7.4.@SpringBootConfiguration
@Configuration注解的變體,只是用來修飾Spring Boot的配置而已。
7.5.@ComponentScan
Spring 3.1添加的一個注解,用來代替配置文件中的component-scan配置,開啟組件掃描,自動掃描包路徑下的@Component注解進行注冊bean實例放到context(容器)中。
8.Redis如何查出1000w key? order:orderId
常規(guī)的查找key,使用的是KEYS pattern 查找所有符合給定模式pattern的key
但使用keys命令在海量數(shù)據(jù)下是有問題的
??? keys指令一次性返回所有匹配的key
??? 鍵的數(shù)量過大會造成服務(wù)的卡頓, 需要等很久才會返回結(jié)果.
從海量key里查詢出某一固定前綴的key 主要用到了SCAN 命令 ,該命令的格式如下:
SCAN cursor [MATCH pattern] [COUNT count]
cursor 為游標(biāo), 即從哪里開始查找, 第一次查找時,傳入0.
MATCH pattern 為查找的條件
count 為返回的個數(shù), 雖然這里可以填寫返回的個數(shù), 但是真實返回的數(shù)量是不可控的, 只能是大概率的返回符合count的參數(shù).
SCAN 命令是一個基于游標(biāo)的迭代器(cursor based iterator): SCAN 命令每次被調(diào)用之后, 都會向用戶返回一個新的游標(biāo), 用戶在下次迭代時需要使用這個新游標(biāo)作為 SCAN 命令的游標(biāo)參數(shù), 以此來延續(xù)之前的迭代過程。
當(dāng) SCAN 命令的游標(biāo)參數(shù)被設(shè)置為 0 時, 服務(wù)器將開始一次新的迭代, 而當(dāng)服務(wù)器向用戶返回值為 0 的游標(biāo)時, 表示迭代已結(jié)束。一次返回的數(shù)量不可控, 只能是大概率的符合count參數(shù)
演示代碼如下, 查詢以order:orderId開頭的key:
?
9.一個表省市區(qū)的查詢語句,類似:同一張表省市縣sql查詢
?
SELECT cy.NAME AS provice,cy.CODE AS proviceCode,ci.NAME AS city,ci.CODE AS cityCode,ct.country AS country,ct.cou2Code AS countryCode FROMt_unionpay_areacode cy LEFT JOIN t_unionpay_areacode ci ON ci.parent_code = cy.CODE AND ci.LEVEL = 2 LEFT JOIN (SELECT cou1.NAME AS city,cou1.CODE AS cou1Code,cou2.NAME AS country,cou2.CODE AS cou2Code FROMt_unionpay_areacode cou1 LEFT JOIN t_unionpay_areacode cou2 ON cou2.parent_code = cou1.CODE AND cou2.LEVEL = 3 WHERE cou1.LEVEL = 2) ct ON ci.NAME = ct.city10.數(shù)據(jù)庫有上億條數(shù)據(jù)的兩個表,有關(guān)聯(lián)字段如何查出表1的2000-2199兩百條與表2的關(guān)聯(lián)數(shù)據(jù)??
?
11.volatile的作用是什么
保持內(nèi)存可見性:所有線程都能看到共享內(nèi)存的最新狀態(tài)。
public class TestInteger {private int value;public int get(){return value;}public void set(int value){this.value = value;} }TestInteger不是線程安全的,因為get和set方法都是在沒有同步的情況下進行的。如果線程1調(diào)用了set方法,那么正在調(diào)用的get的線程2可能會看到更新后的value值,也可能看不到。
解決方法很簡單,將value聲明為volatile變量
private volatile int value;volatile的特殊規(guī)則就是:
- read、load、use動作必須連續(xù)出現(xiàn)。
- assign、store、write動作必須連續(xù)出現(xiàn)。
所以,使用volatile變量能夠保證:
- 每次讀取前必須先從主內(nèi)存刷新最新的值。
- 每次寫入后必須立即同步回主內(nèi)存當(dāng)中。
也就是說,volatile關(guān)鍵字修飾的變量看到的隨時是自己的最新值。線程1中對變量v的最新修改,對線程2是可見的。
12.Tomcat的結(jié)構(gòu)是什么,數(shù)據(jù)量大了如何優(yōu)化
來自:Tomcat內(nèi)部結(jié)構(gòu)、工作原理、工作模式和運行模式、tomcat 體系結(jié)構(gòu)詳解
組成結(jié)構(gòu)
Tomcat的體系結(jié)構(gòu)可以由Server.xml看出
<Server> ... <Service> ... <!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" 譯:service由多個connectors組成,多個service共享一個container(容器)。Note: A "Service" is not itself a "Container",so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html --> <Connector> ...<!--The connectors can use a shared executor, you can define one or more named thread pools-->譯:多個connector共享一個執(zhí)行器(指Engine),你能定義一個或多個線程進入線程池。//這個按照我的理解翻譯的<!-- A "Connector" using the shared thread pool-->譯:一個connector共享一個線程池</Connector><Engine> ... <!-- An Engine represents the entry point (within Catalina) that processes every request.譯:一個Engine代表處理每個request請求的入口點(在Catalina中)The Engine implementation for Tomcat stand alone analyzes the HTTP headers included with the request, and passes them on to the appropriate Host (virtual host).Documentation at /docs/config/engine.html --> <!-- You should set jvmRoute to support load-balancing via AJP ie :<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> --> <Host> ... <Context> ...</Context></Host></Engine></Service></Server>?
?
性能優(yōu)化
來自:有關(guān)Tomcat提高并發(fā)量,性能優(yōu)化的問題(已解決)
1.在Tomcat目錄的bin/catalina.bat,打開這個文件,在前面添加一下配置
jvm在client模式,進行內(nèi)存回收時,會停下所有的其它工作,待回收完畢才去執(zhí)行其它任務(wù),在這期間eclipse就卡住了。所以適當(dāng)?shù)脑黾觠vm申請的內(nèi)存大小來減少其回收的次數(shù)甚至不回收,就會是卡的現(xiàn)象有明顯改善。 ?
???? 可以給Java虛擬機設(shè)置使用的內(nèi)存,但是如果你的選擇不對的話,虛擬機不會補償。可通過命令行的方式改變虛擬機使用內(nèi)存的大小。如下表所示有兩個參數(shù)用來設(shè)置虛擬機使用內(nèi)存的大小。
???? 參數(shù)????? 描述
??? -Xms????? JVM初始化堆的大小
??? -Xmx????? JVM堆的最大值
這兩個值的大小一般根據(jù)需要進行設(shè)置。初始化堆的大小執(zhí)行了虛擬機在啟動時向系統(tǒng)申請的內(nèi)存的大小。一般而言,這個參數(shù)不重要。但是有的應(yīng)用程序在大負(fù)載 的情況下會急劇地占用更多的內(nèi)存,此時這個參數(shù)就是顯得非常重要,如果虛擬機啟動時設(shè)置使用的內(nèi)存比較小而在這種情況下有許多對象進行初始化,虛擬機就必 須重復(fù)地增加內(nèi)存來滿足使用。
??? 由于這種原因,我們一般把-Xms和-Xmx設(shè)為一樣大,而堆的最大值受限于系統(tǒng)使用的物理內(nèi)存。一般使用數(shù)據(jù)量較大的應(yīng)用程序會使用持久對象,內(nèi)存使用 有可能迅速地增長。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時虛擬機就會提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值 的80%。
??? Tomcat默認(rèn)可以使用的內(nèi)存為128MB,在較大型的應(yīng)用項目中,這點內(nèi)存是不夠的,需要調(diào)大。
??? JAVA_OPTS='-Xms【初始化內(nèi)存大小】
??? -Xmx【可以使用的最大內(nèi)存】'
??? 需要把這個兩個參數(shù)值調(diào)大。
Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增加如下設(shè)置:
? 主要功能為JVM性能參數(shù)調(diào)優(yōu)
?
?1).JAVA_OPTS'-Xms256m-Xmx512m'
表示初始化內(nèi)存為256MB,可以使用的最大內(nèi)存為512MB。
另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應(yīng)用有關(guān),應(yīng)該通過分 析實際的垃圾收集的時間和頻率來調(diào)整。如果堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內(nèi)存的需要一致,完全收集就很 快,但是會更加頻繁。調(diào)整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內(nèi)最大化處理客戶的請求。在基準(zhǔn)測試的時候,為保證最好的性能,要把堆的 大小設(shè)大,保證垃圾收集不在整個基準(zhǔn)測試的過程中出現(xiàn)。
???? 如果系統(tǒng)花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應(yīng)該不超過3-5秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳 細輸出,研究垃圾收集參數(shù)對性能的影響。一般說來,你應(yīng)該使用物理內(nèi)存的80%作為堆大小。當(dāng)增加處理器時,記得增加內(nèi)存,因為分配可以并行進行,而垃圾 收集不是并行的。
2.打開conf/server.xml,并更改一下內(nèi)容
maxThreads 客戶請求最大線程數(shù)
minSpareThreads Tomcat初始化時創(chuàng)建的 socket 線程數(shù)
maxSpareThreads Tomcat連接器的最大空閑 socket 線程數(shù)
enableLookups 若設(shè)為true, 則支持域名解析,可把 ip 地址解析為主機名
redirectPort 在需要基于安全通道的場合,把客戶請求轉(zhuǎn)發(fā)到基于SSL 的 redirectPort 端口
acceptAccount 監(jiān)聽端口隊列最大數(shù),滿了之后客戶請求會被拒絕(不能小于maxSpareThreads )
connectionTimeout 連接超時
minProcessors 服務(wù)器創(chuàng)建時的最小處理線程數(shù)
maxProcessors 服務(wù)器同時最大處理線程數(shù)
URIEncoding URL統(tǒng)一編碼
?
保存后,啟動tomcat進行壓力測試。結(jié)果最后錯誤率還是沒有改變(這里其實Tomcat的并發(fā)性能已經(jīng)提高了)
3.我想可能是mysql數(shù)據(jù)的連接問題,于是編輯了數(shù)據(jù)庫連接文件datasource.properties,將最大連接數(shù)與最長等待空間編輯如下
#初始連接數(shù) db.initialSize = 20 #定義最大連接數(shù) db.maxActive = 200 #定義最大空間 db.maxIdle = 20 #定義最小空間 db.minIdle = 10 #定義最長等待時間 db.maxWait = 2000 db.defaultAutoCommit = true db.minEvictableIdleTimeMillis = 3600000最后測試結(jié)果,系統(tǒng)性能明顯提高,并發(fā)量增大并且穩(wěn)定
測試為每秒500次請求同一個接口,測試次數(shù)10次,5000次請求成功,且返回數(shù)據(jù)無丟失。
并發(fā)量500無壓力,并發(fā)量800無壓力。
當(dāng)并發(fā)量達到1000時,查看結(jié)果報告,1000次中出現(xiàn)三次請求失敗。
4.經(jīng)過以上配置,提高了系統(tǒng)性能,并發(fā)量接近1000次/s
?
13.Jdk線程類型
?
Hashmap? hashTable區(qū)別?? currentHashMap如何保證同步,數(shù)據(jù)不重復(fù)
集合
Hashset可以存空值嗎
Spring bean 是單例的嗎?? 默認(rèn)單例? 可以修改
隊列queen和棧stack
Aop場景?slf4j? 事務(wù) Transactional
Feign是什么?如何使用?
Redis部署單機? 集群? 哨兵模式的區(qū)別
性能優(yōu)化? 如 查垃圾收集情況得命令
項目管理理論? 敏捷開發(fā)等
?
Mysql 主鍵和唯一索引的區(qū)別?
主鍵是一種約束,唯一索引是一種索引,兩者在本質(zhì)上是不同的。
主鍵創(chuàng)建后一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在創(chuàng)建時,已經(jīng)默認(rèn)為非空值 + 唯一索引了。
主鍵可以被其他表引用為外鍵,而唯一索引不能。
一個表最多只能創(chuàng)建一個主鍵,但可以創(chuàng)建多個唯一索引。
主鍵和唯一索引都可以有多列。
主鍵更適合那些不容易更改的唯一標(biāo)識,如自動遞增列、身份證號等。
在 RBO 模式下,主鍵的執(zhí)行計劃優(yōu)先級要高于唯一索引。 兩者可以提高查詢的速度。
?
索引的類型?
普通索引、唯一索引、全文索引
?
1.字符串截取用什么方法
2.查找一個字符串中字符的位置用什么方法
3.想要獲取一個字符串中的一個單詞 (這個單詞有可能不在字符串中)
4.詳細描述下list
5.什么是事務(wù),怎么利用事務(wù)
6.簡述下重載與重寫的區(qū)別,兩者父類與子類的返回值要求相同嗎?
7.現(xiàn)場給我出了一個數(shù)據(jù)庫題目,一個表,是描述奧運會中每個國家每個項目所獲得的獎牌數(shù),求每個國家所獲得獎牌總數(shù)
8.簡述下三大框架
9.描述你所做過的項目,談?wù)勂渲兴募夹g(shù)
?貓跡商城:使用了springmvc框架,mybatis作為數(shù)據(jù)持久化的中間件,mysql做數(shù)據(jù)庫,redis作為分布式緩存。
?一物一碼營銷系統(tǒng):使用springboot框架,微服務(wù)思想,多模塊開發(fā),mybatis-plus工具,mysql數(shù)據(jù)庫,redis做緩存。部分功能采用多線程開發(fā),提高生產(chǎn)效率
?招商證券案例管理系統(tǒng):非開源微服務(wù)架構(gòu),
中信銀行-動卡空間-積分游戲:采用springboot框架,mybatis作為中間件,mysql數(shù)據(jù)庫,redis緩存,接入eureka服務(wù)注冊中心,kafka分布式消息訂閱與發(fā)布系統(tǒng),開發(fā)時保證業(yè)務(wù)代碼的行覆蓋率不低于85%,并編寫單元測試。
10.怎么更改oracle字符集
11.數(shù)據(jù)庫怎么優(yōu)化查詢
12.數(shù)據(jù)結(jié)構(gòu)有哪些算法
13.什么是存儲過程,簡述下存儲過程與函數(shù)的區(qū)別
14.什么是游標(biāo)
面向?qū)ο笫鞘裁?有什么用途 封裝的用途
數(shù)據(jù)庫事務(wù)的四大特性是什么? 以及什么是隔離性
事務(wù)的四大特性(ACID)
?
如果一個數(shù)據(jù)庫聲稱支持事務(wù)的操作,那么該數(shù)據(jù)庫必須要具備以下四個特性:
1、原子性(Atomicity)
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。
2、一致性(Consistency)
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。拿轉(zhuǎn)賬來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性。
3、隔離性(Isolation)
隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。
即要達到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行。
4、持久性(Durability)
?
持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
例如我們在使用JDBC操作數(shù)據(jù)庫時,在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)以及正確提交,
即使這時候數(shù)據(jù)庫出現(xiàn)了問題,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會造成我們看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫因為故障而沒有執(zhí)行事務(wù)的重大錯誤。
事務(wù)的隔離級別(默認(rèn)事務(wù)級別為可重復(fù)讀)數(shù)據(jù)庫事務(wù)無非就兩種:讀取事務(wù)(select)、修改事務(wù)(update,insert)修改時允許修改(丟失更新)
B) 修改時允許讀取(臟讀)
C) 讀取時允許修改(不可重復(fù)讀)
D) 讀取時允許插入(幻讀)
從上到下問題越來越不嚴(yán)重,但所需的性能開銷卻越大。
臟讀
臟讀是指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)。
不可重復(fù)讀
不可重復(fù)讀是指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了。
虛讀(幻讀)
幻讀是事務(wù)非獨立執(zhí)行時發(fā)生的一種現(xiàn)象。
低級別的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。
MySQL數(shù)據(jù)庫的四種事務(wù)隔離級別
Read Uncommitted(讀取未提交內(nèi)容)
?
?????? 在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。本隔離級別很少用于實際應(yīng)用,因為它的性能也不比其他級別好多少。讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read);
Read Committed(讀取提交內(nèi)容)
?????? 這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。這種隔離級別 也支持所謂的不可重復(fù)讀(Nonrepeatable Read),因為同一事務(wù)的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結(jié)果;
Repeatable Read(可重讀)
?????? 這是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)。
?????? 簡單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行。
?????? InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機制解決了該問題
Serializable(可串行化)
?????? 這是最高的隔離級別,它通過強制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。
???????? 這四種隔離級別采取不同的鎖類型來實現(xiàn),若讀取的是同一個數(shù)據(jù)的話,就容易發(fā)生問題。例如:
?
???????? 臟讀(Drity Read):某個事務(wù)已更新一份數(shù)據(jù),另一個事務(wù)在此時讀取了同一份數(shù)據(jù),由于某些原因,前一個RollBack了操作,則后一個事務(wù)所讀取的數(shù)據(jù)就會是不正確的。
???????? 不可重復(fù)讀(Non-repeatable read):在一個事務(wù)的兩次查詢之中數(shù)據(jù)不一致,這可能是兩次查詢過程中間插入了一個事務(wù)更新的原有的數(shù)據(jù)。
???????? 幻讀(Phantom Read):在一個事務(wù)的兩次查詢中數(shù)據(jù)筆數(shù)不一致,例如有一個事務(wù)查詢了幾列(Row)數(shù)據(jù),而另一個事務(wù)卻在此時插入了新的幾列數(shù)據(jù),先前的事務(wù)在接下來的查詢中,就會發(fā)現(xiàn)有幾列數(shù)據(jù)是它先前所沒有的。
???????? 在MySQL中,實現(xiàn)了這四種隔離級別,分別有可能產(chǎn)生問題如下所示:
????????
???????? 20151219142625513.jpg (838?267)
① Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。
② Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
③ Read committed (讀已提交):可避免臟讀的發(fā)生。
④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
?
以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當(dāng)然級別越高,執(zhí)行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時選用何種隔離級別應(yīng)該根據(jù)實際情況。在MySQL數(shù)據(jù)庫中默認(rèn)的隔離級別為Repeatable read (可重復(fù)讀)。
在MySQL數(shù)據(jù)庫中,支持上面四種隔離級別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認(rèn)的為Read committed級別。
?
?
問了一個數(shù)據(jù)庫的查詢語句 怎么查出數(shù)據(jù)庫中兩條完全相同的數(shù)據(jù)(select * from noid a group by id,name,age having count(*)>0? 這樣應(yīng)該可以吧... 當(dāng)時沒想出來)
數(shù)據(jù)庫鎖
列舉幾個復(fù)雜度nlogn的排序算法:歸并排序—遞歸法實現(xiàn)
怎么用Java實現(xiàn)一個棧的操作 棧:后進先出集合
什么是方法重寫 什么是方法重載
什么是多態(tài) 怎么實現(xiàn)
?
多線程,線程鎖 sleep和wait區(qū)別 同步方法
這兩個方法來自不同的類分別是,sleep來自Thread類,和wait來自O(shè)bject類。
sleep是Thread的靜態(tài)類方法,誰調(diào)用的誰去睡覺,即使在a線程里調(diào)用了b的sleep方法,實際上還是a去睡覺,要讓b線程睡覺要在b的代碼中調(diào)用sleep。最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
sleep不出讓系統(tǒng)資源;wait是進入線程等待池等待,出讓系統(tǒng)資源,其他線程可以占用CPU。一般wait不會加時間限制,因為如果wait線程的運行資源不夠,再出來也沒用,要等待其他線程調(diào)用notify/notifyAll喚醒等待池中的所有線程,才會進入就緒隊列等待OS分配系統(tǒng)資源。sleep(milliseconds)可以用時間指定使它自動喚醒過來,如果時間不到只能調(diào)用interrupt()強行打斷。
?
Spring的常用注解 列舉 以及@controller 和 @service的區(qū)別
事務(wù)的注解使用
Springmvc常用的注解 列舉
實習(xí)項目用到的框架,語言
1.java基本類型
2.int byte short 長度
3.字節(jié)和位的關(guān)系
4.哈希碰撞,有沒有其他解決哈希碰撞的原理【沒有,我就給說了一下HashMap解決哈希碰撞的方法】
5.冪等性
6.ArrayList LinkList的時間復(fù)雜度
7.數(shù)據(jù)庫【剛要問,因為我們數(shù)據(jù)庫數(shù)據(jù)比較少又是JPA,也沒有涉及SQL優(yōu)化,所以也沒有怎么聊】
8.數(shù)據(jù)庫ACID
9.幻讀怎么回事
10.SpringMVC怎么返回實體類【當(dāng)然是json】
11.SpringMVC處理流程
12.只接收GET請求,怎么辦
13.講彈性EIP項目
14.講敏感詞引擎項目
15.共享帶寬項目
16.JAVA 8新特性,隨便手寫一個Lamda表達式
?
?
總結(jié)
- 上一篇: matlab正交表,正交表的构造方法及M
- 下一篇: python爬虫刷网课答题_python