事務是邏輯上的一組操作,要么都執行,要么都不執行。事務最經典的例子就是轉賬了。假如小明要給小紅轉賬1000元,這個轉賬會涉及到兩個關鍵操作就是:將小明的余額減少1000元,將小紅的余額增加1000元。萬一在這兩個操作之間突然出現錯誤比如銀行系統崩潰,導致小明余額減少而小紅的余額沒有增加,這樣就不對了。事務就是保證這兩個關鍵操作要么都成功,要么都要失敗。
數據庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、持久性(Durability)。
● 原子性:事務是最小的執行單位,不允許分割。整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節。
● 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。
● 隔離性:并發訪問數據庫時,一個用戶的事務不被其他事務所干擾,各并發事務之間數據庫是獨立的;
● 持久性:在事務完成以后,該事務對數據庫中數據的改變是持久的。即使數據庫發生故障也不應該對其有任何影響。
數據庫的隔離級別越高,并發性就越差,性能就越低。
oracle的隔離級別默認是READ COMMITED
mysql的隔離級別默認是REPEATABLE READ,mysql下的事務默認是自動提交的。
讀未提交:事務A在事務B未提交前讀取數據,如果事務B撤銷了修改,那么A會讀取到臟數據。因為事務B提交前的數據在緩存中
讀已提交:事務A分別在事務B提交前和提交后讀取數據,出現不可重復讀。因為事務B提交前的數據在緩存,事務B提交后的數據在硬盤,而事務A一直讀取的都是硬盤的數據從而導致不能夠重復讀的問題。
可重復讀:事務A在事務B添加一條數據提交后,事務A讀取記錄數的時候不一致出現幻讀。不可重復讀的重點在于Update和Delete,而幻讀在于Insert。
在典型的應用程序中,如果多個事務并發運行可能會導致以下的問題。
在不同的隔離級別下,V值分別如下:
讀未提交 | 讀已提交 | 可重復讀 | 串行化 | |
---|---|---|---|---|
V1 | 2 | 1 | 1 | 1 |
V2 | 2 | 2 | 1 | 1 |
V3 | 2 | 2 | 2 | 2 |
與標準的SQL隔離級別不同的是,InnoDB在可重復讀級別下,利用Next-Key Lock解決了幻讀問題,能夠完全保證事務的隔離性,達到了串行化級別。
索引最大的好處是提高查詢速度,
缺點是更新數據時效率低,因為要同時更新索引
對數據進行頻繁查詢進建立索引,如果要頻繁更改數據不建議使用索引。
聚簇索引:將數據存儲與索引放到了一塊,找到索引也就找到了數據。
非聚簇索引:將數據存儲于索引分開結構,索引結構的葉子節點指向了數據的對應行,MyISAM通過key_buffer把索引先緩存到內存中,當需要訪問數據時(通過索引訪問數據),在內存中直接搜索索引,然后通過索引找到磁盤相應數據,這也就是為什么索引不在key buffer命中時,速度慢的原因。
1.聚集索引決定了數據庫的物理存儲結構,而主鍵只是確定表格邏輯組織方式。這兩者不可混淆!
2.在InnoDB下主鍵索引是聚集索引,在MyISAM下主鍵索引是非聚集索引。
存儲過程是用戶定義的一系列sql語句的集合,涉及特定表或其它對象的任務,用戶可以調用存儲過程,而函數通常是數據庫已定義的方法,它接收參數并返回某種類型的值并且不涉及特定用戶表。
存儲過程,就是一些編譯好了的SQL語句,這些SQL語句代碼像一個方法一樣實現一些功能(對單表或多表的增刪改查),然后給這些代碼塊取一個名字,在用到這個功能的時候調用即可。
優點:存儲過程是一個預編譯的代碼塊,執行效率比較高;存儲過程在服務器端運行,減少客戶端的壓力;允許模塊化程序設計,只需要創建一次過程,以后在程序中就可以調用該過程任意次,類似方法的復用;一個存儲過程替代大量T_SQL語句 ,可以降低網絡通信量,提高通信速率;可以一定程度上確保數據安全。
缺點:調試麻煩、可移植性不靈活、重新編譯問題.
1)觸發器,指一段代碼,當觸發某個事件時,自動執行這些代碼。
2)使用場景:可以通過數據庫中的相關表實現級聯更改;實時監控某張表中的某個字段的更改而需要做出相應的處理。
視圖是一種虛擬的表,具有和物理表相同的功能。可以對視圖進行增,改,查,操作,視圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數據更容易,相比多表查詢。
游標:是對查詢出來的結果集作為一個單元來有效的處理。游標可以定在該單元中的特定行,從結果集的當前行檢索一行或多行??梢詫Y果集當前行做修改。一般不使用游標,但是需要逐條處理數據的時候,游標顯得十分重要。
1)使用視圖可以簡化復雜的sql操作,隱藏具體的細節,保護數據;
2)視圖不能被索引,也不能有關聯的觸發器或默認值,如果視圖本身內有order by則對視圖再次order by將被覆蓋。對于某些視圖,例如,未使用聯結子查詢分組聚集函數Distinct Union等,是可以對其更新的,對視圖的更新將對基表進行更新;但是視圖主要用于簡化檢索,保護數據,并不用于更新,而且大部分視圖都不可以更新。
數據庫連接是一種關鍵的有限的昂貴的資源,對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序 的性能指標。數據庫連接池正是針對這個問題提出來的。
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了 這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。