摘要:事務處理事務的概念來自于兩個獨立的需求并發數據庫訪問,系統錯誤恢復。一致性事務將數據庫從一種一致狀態轉變為下一種一致狀態。等多數數據庫默認都是該級別。獨占鎖鎖,也叫排他鎖一次只能有一個獨占鎖用在一個資源上,并且阻止其他所有的鎖包括共享縮。
事務處理
事務的概念來自于兩個獨立的需求:并發數據庫訪問,系統錯誤恢復。
一個事務是可以被看作一個單元的一系列SQL語句的集合。
事務的特性(ACID)atomacity 原子性 :事務必須是原子工作單元;對于其數據修改,要么全都執行,要么全都不執行。通常,與某個事務關聯的操作具有共同的目標,并且是相互依賴的。如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。
consistency 一致性:事務將數據庫從一種一致狀態轉變為下一種一致狀態。也就是說,事務在完成時,必須使所有的數據都保持一致狀態(各種 constraint 不被破壞)。
isolation 隔離性:由并發事務所作的修改必須與任何其它并發事務所作的修改隔離。事務查看數據時數據所處的狀態,要么是另一并發事務修改它之前的狀態,要么是另一事務修改它之后的狀態,事務不會查看中間狀態的數據。換句話說,一個事務的影響在該事務提交前對其他事務都不可見。
durability 持久性:事務完成之后,它對于系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。
事務的隔離級別如果不對數據庫進行并發控制,可能會產生異常情況:
臟讀(Dirty Read)
當一個事務讀取另一個事務尚未提交的修改時,產生臟讀。
一個事務開始讀取了某行數據,但是另外一個事務已經更新了此數據但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾,也就是說讀取出的數據其實是錯誤的。
非重復讀(Nonrepeatable Read)
一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發生非重復讀。
幻像讀(Phantom Reads)
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入數據造成的。
當對某行執行插入或刪除操作,而該行屬于某個事務正在讀取的行的范圍時,會發生幻像讀問題。
丟失修改(Lost Update)
第一類:當兩個事務更新相同的數據源,如果第一個事務被提交,第二個卻被撤銷,那么連同第一個事務做的更新也被撤銷。
第二類:有兩個并發事務同時讀取同一行數據,然后其中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。
為了兼顧并發效率和異常控制,在標準SQL規范中,定義了4個事務隔離級別,( Oracle 和 SQL Server 對標準隔離級別有不同的實現 )
未提交讀(Read Uncommitted)
直譯就是讀未提交,意思就是即使一個更新語句沒有提交,但是別的事務可以讀到這個改變。
Read Uncommitted允許臟讀。
已提交讀(Read Committed)
直譯就是讀提交,意思就是語句提交以后,即執行了 Commit以后別的事務就能讀到這個改變,只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別。
Read Commited 不允許臟讀,但會出現非重復讀。
可重復讀(Repeatable Read):
直譯就是可以重復讀,這是說在同一個事務里面先后執行同一個查詢語句的時候,得到的結果是一樣的。
Repeatable Read 不允許臟讀,不允許非重復讀,但是會出現幻象讀。
串行讀(Serializable)
直譯就是序列化,意思是說這個事務執行的時候不允許別的事務并發執行。完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。
Serializable 不允許不一致現象的出現。
事務隔離的實現——鎖共享鎖(S鎖)
用于只讀操作(SELECT),鎖定共享的資源。共享鎖不會阻止其他用戶讀,但是阻止其他的用戶寫和修改。
更新鎖(U鎖)
用于可更新的資源中。防止當多個會話在讀取、鎖定以及隨后可能進行的資源更新時發生常見形式的死鎖。
獨占鎖(X鎖,也叫排他鎖)
一次只能有一個獨占鎖用在一個資源上,并且阻止其他所有的鎖包括共享縮。寫是獨占鎖,可以有效的防止“臟讀”。
Read Uncommited 如果一個事務已經開始寫數據,則另外一個數據則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。
Read Committed 讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。
Repeatable Read 讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。可以通過“共享讀鎖”和“排他寫鎖”實現。
Serializable 讀加共享鎖,寫加排他鎖,讀寫互斥。
索引數據庫創建索引能夠大大提高系統的性能。
通過創建唯一性的索引,可以保證數據庫表中每一行數據的唯一性。
可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。
可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
在使用分組和排序子句進行數據檢索時,同樣可以顯著的減少查詢中分組和排序的時間。
通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。
增加索引也有許多不利的方面。
創建索引和維護索引需要消耗時間,這種時間隨著數量的增加而增加。
索引需要占物理空間,除了數據表占據數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要額空間就會更大。
當對表中的數據進行增加,刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。
應該對如下的列建立索引
在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構。
在經常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度。
在經常需要根據范圍進行搜索的列上創建索引,因為索引已經排序,其指定的范圍是連續的。
在經常需要排序的列上創建索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間。
在經常使用在where子句中的列上面創建索引,加快條件的判斷速度。
有些列不應該創建索引
在查詢中很少使用或者作為參考的列不應該創建索引。
對于那些只有很少數據值的列也不應該增加索引(比如性別,結果集的數據行占了表中數據行的很大比例,即需要在表中搜索的數據行的比例很大。增加索引,并不能明顯加快檢索速度)。
對于那些定義為text,image和bit數據類型的列不應該增加索引。這是因為,這些列的數據量要么相當大,要么取值很少。
當修改性能遠遠大于檢索性能時,不應該創建索引,因為修改性能和檢索性能是矛盾的。
創建索引的方法:直接創建和間接創建(在表中定義主鍵約束或者唯一性約束時,同時也創建了索引)。
索引的特征:
唯一性索引保證在索引列中的全部數據是唯一的,不會包含冗余數據。
復合索引就是一個索引創建在兩個列或者多個列上。可以減少在一個表中所創建的索引數量。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17625.html
摘要:布局垂直居中生命周期優化手段常用的新特性面向對象原型切割文件各種原生用法瀏覽器緩存機制機制 1 css布局2 垂直居中3 react生命周期 優化手段 purerender4 es6常用的新特性5 this6 面向對象 原型7 webpack 切割文件8 array string各種原生用法9 promise10 瀏覽器緩存機制11 mobx機制
摘要:正如我標題所說,簡歷被拒。看了我簡歷之后說頭條競爭激烈,我背景不夠,點到為止。。三準備面試其實從三月份投遞簡歷開始準備面試到四月份收,也不過個月的時間,但這都是建立在我過去一年的積累啊。 本文是 無精瘋 同學投稿的面試經歷 關注微信公眾號:進擊的java程序員K,即可獲取最新BAT面試資料一份 在此感謝 無精瘋 同學的分享 目錄: 印象中的頭條 面試背景 準備面試 ...
閱讀 1802·2021-11-24 09:39
閱讀 2290·2021-09-30 09:47
閱讀 4144·2021-09-22 15:57
閱讀 1873·2019-08-29 18:36
閱讀 3577·2019-08-29 12:21
閱讀 590·2019-08-29 12:17
閱讀 1263·2019-08-29 11:25
閱讀 724·2019-08-28 18:26