數據庫:事務(存儲引擎)

事務

其實對於事務而言,我們就是爲了數據庫恢復技術而產生的概念。

    事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向數據的資源。通過將一組相關操作組合爲一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程序更加可靠。

    對於事務有如下相關屬性:

  • 原子性(Atomic)(Atomicity)

事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的;如果系統只執行這些操作的一個子集,則可能會破壞事務的總體目標,原子性消除了系統處理操作子集的可能性;



  • 一致性(Consistent)(Consistency)

事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的;



  • 隔離性(Insulation)(Isolation)

由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲隔離性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的結果與通過連續運行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程序降低隔離級別以換取更大的吞吐量;



  • 持久性(Duration)(Durability)

事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持;


對於上述特徵而言,事務是恢復和併發控制的基本單位!

保證事務ACID特性是事務管理的重要任務,事務ACID特性可能遭到破壞的因素有:

1.多個事務並行運行時,不同的事務操作交叉執行:不滿足原子性,有點像可重入函數的避免思想。

2.事務在運行過程中被強行停止,也就是產生了片段中斷但發生副作用卻未達到目的。




事務的三種模型:

  1. 隱式事務是指每一條數據操作語句都自動地成爲一個事務,事務的開始是隱式的,事務的結束有明確的標記;

  2. 顯式事務是指有顯式的開始和結束標記的事務,每個事務都有顯式的開始和結束標記;

  3. 自動事務是系統自動默認的,開始和結束不用標記;


使用事務的語句:

  1. 開始事物:BEGIN  TRANSACTION

  2. 提交事物:COMMIT  TRANSACTION

  3. 回滾事務:ROLLBACK  TRANSACTION


事務的保存點:

  1. SAVE  TRANSACTION  保存點名稱 ——自定義保存點的名稱和位置

  2. ROLLBACK  TRANSACTION  保存點名稱 ——回滾到自定義的保存點




存儲引擎:

        MySQL中的數據用各種不同的技術存儲在文件(或者內存)中,這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力,通過選擇不同的技術,能夠獲得額外的速度或者功能,從而改善應用的整體功能。這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型);

        MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啓用。可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及需要數據結合什麼性能和功能的時候能提供最大的靈活性。


下面主要介紹幾種常用的存儲引擎:

MyISAM

特性
不支持事務:MyISAM存儲引擎不支持事務,所以對事務有要求的業務場景不能使用
表級鎖定:其鎖定機制是表級索引,這雖然可以讓鎖定的實現成本很小但是也同時大大降低了其併發性能
讀寫互相阻塞:不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身並不會阻塞另外的讀
只會緩存索引:MyISAM可以通過key_buffer緩存以大大提高訪問性能減少磁盤IO,但是這個緩存區只會緩存索引,而不會緩存數據

適用場景
不需要事務支持(不支持)
併發相對較低(鎖定機制問題)
數據修改相對較少(阻塞問題)
以讀爲主
數據一致性要求不是非常高

最佳實踐
儘量索引(緩存機制)
調整讀寫優先級,根據實際需求確保重要操作更優先
啓用延遲插入改善大批量寫入性能
儘量順序操作讓insert數據都寫入到尾部,減少阻塞
分解大的操作,降低單個操作的阻塞時間
降低併發數,某些高併發場景通過應用來進行排隊機制
對於相對靜態的數據,充分利用Query Cache可以極大的提高訪問效率
MyISAM的Count只有在全表掃描的時候特別高效,帶有其他條件的count都需要進行實際的數據訪問

InnoDB

特性
具有較好的事務支持:支持4個事務隔離級別,支持多版本讀

行級鎖定:通過索引實現,全表掃描仍然會是表鎖,注意間隙鎖的影響
讀寫阻塞與事務隔離級別相關
具有非常高效的緩存特性:能緩存索引,也能緩存數據
整個表和主鍵以Cluster方式存儲,組成一顆平衡樹
所有Secondary Index都會保存主鍵信息

適用場景
需要事務支持(具有較好的事務特性)
行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引完成
數據更新較爲頻繁的場景
數據一致性要求較高
硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,儘可能減少磁盤 IO

最佳實踐
主鍵儘可能小,避免給Secondary index帶來過大的空間負擔
避免全表掃描,因爲會使用表鎖
儘可能緩存所有的索引和數據,提高響應速度
在大批量小插入的時候,儘量自己控制事務而不要使用autocommit自動提交
合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性
避免主鍵更新,因爲這會帶來大量的數據移動

NDBCluster

特性
分佈式:分佈式存儲引擎,可以由多個NDBCluster存儲引擎組成集羣分別存放整體數據的一部分
支持事務:和Innodb一樣,支持事務

可與mysqld不在一臺主機:可以和mysqld分開存在於獨立的主機上,然後通過網絡和mysqld通信交互
內存需求量巨大:新版本索引以及被索引的數據必須存放在內存中,老版本所有數據和索引必須存在與內存中

適用場景
具有非常高的併發需求
對單個請求的響應並不是非常的critical
查詢簡單,過濾條件較爲固定,每次請求數據量較少,又不希望自己進行水平Sharding

最佳實踐
儘可能讓查詢簡單,避免數據的跨節點傳輸
儘可能滿足SQL節點的計算性能,大一點的集羣SQL節點會明顯多餘Data節點
在各節點之間儘可能使用萬兆網絡環境互聯,以減少數據在網絡層傳輸過程中的延時

注:以上三個存儲引擎是目前相對主流的存儲引擎,還有其他類似如:Memory,Merge,CSV,Archive等存儲引擎的使用場景都相對較少,這裏就不一一分析了。


MyISAM和inonoDB。Myisam不支持事務。 Innodb支持事務。

拓展:例如,如果你在研究大量的臨時數據,你也許需要使用內存存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啓用。你可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。選擇如何存儲和檢索你的數據的這種靈活性是MySQL爲什麼如此受歡迎的主要原因。

各種存儲引擎特點:

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/82/8E/wKioL1daWLqBmCVJAAEj6sadGVM828.png" title="QQ圖片20160610135707.png" alt="wKioL1daWLqBmCVJAAEj6sadGVM828.png" style="padding:0px;margin:0px;vertical-align:top;border:none;float:none;" />


另外,可以使用SHOW TABLE STATUS FROMDBname來查看當前數據庫中各表的引擎;

創建一個新表時,可以通過在CREATE語句中ENGINE或TYPE選項來告訴MySQL要創建什麼類型的表:

CREATE TABLE t (i INT) ENGINE = INNODB;

CREATE TABLE t (i INT) TYPE = MEMORY;
如果省略掉ENGINE或TYPE選項,默認的存儲引擎被使用。當MySQL被用MySQL配置嚮導安裝在Windows平臺上,InnoDB存儲引擎替代MyISAM存儲引擎作爲默認。當不可用的類型被指定時,自動用InnoDB表來替代。

還可以把表從一個類型轉到另一個類型,使用ALTERTABLE語句:

ALTER TABLE t ENGINE = MYISAM;

ALTER TABLE t TYPE = BDB;


本文出自 “剩蛋君” 博客,請務必保留此出處http://memory73.blog.51cto.com/10530560/1788824

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章