標籤:mysql 效能最佳化
1、事務的概念
2、在MySQL中哪些儲存引擎(表類型)支援事務哪些不支援
3、事務的四個屬性
4、mysql事務的建立與存在周期
5、mysql行為
6、事務的孤立性和效能
7、mysql的偽事務
一、事務的概念
事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會復原。所有受到影響的資料將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。
二、MySQL 中的儲存引擎以及支援事務,和不支援事務的儲存引擎
1、儲存引擎的概念:在mysql中的資料用各種不同的技術儲存在檔案(或記憶體)中。
這些技術中的每一種技術都使用不同的儲存機制,索引 技巧,並且最終提供廣泛的不同的功能和能力。可以通過選擇不同的技術,可以獲得額外的速度或功能,從而改善應用的整體功能。
2、這些不同的技術以及配套的相關功能在mysql中被稱為儲存引擎(也稱為表類型)。
3、通過show engines;來查看mysql支援的儲存引擎。
4、 在mysql中用的最多的儲存引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支援事務而myisam等不支援事務。
三、事務的四個屬性:
1、原子性:事務是由一個或一組相互關聯的SQL語句組成,這些語句被認為是一個不可分割的單元。
2、一致性:對於資料庫的修改是一致的,即多個使用者查的的資料是一樣的。一致性主要由mysql的日誌機制處理,他記錄資料的變化,為事務恢複提供追蹤記錄。
3、隔離性(孤立性):每個事務都有自己的空間,和其他發生在系統中的事務隔離開來,而且事務的結果只在他完全被執行時才能看到
4、持久性:但提交了這個事務之後對資料的修改更新就是永久的。當一個事務完成,資料庫的日誌已經被更新時,持久性即可發揮其特有的 功效,在mysql中,如果系統崩潰或者資料存放區介質被破壞,通過日誌,系統能夠恢複在重啟前進行的最後一次成功更新,可以反應系統崩潰時處於執行過程的事物的變化。
四、事務的建立及生存周期
對於支援事務的儲存引擎,一個事務的周期:
1、在建立事務的過程中,使用者需要建立一個innodb或bdb類型的資料表,其基本命令結構如下:
create table table_name (file defintions) type=innodb/bdb;
2、對錶類型進行修改
alert table table-name type =innodb/bdb;
3、事務的整個過程
use databases; //使用某個資料庫
start transaction ; //開始事務 、這裡也可以使用 begin 、 beginwork
insert into stu1 values(‘‘, ); //進行相關的操作
commit //提交事物
rollback //撤銷事務(交易回復)
五:mysql行為
1、我們在使用mysql是如果關閉之後,開啟在查詢的話就會發現,哪些資料已經儲存了,但是我們知道,在這過程中沒有進行顯示或隱式提交,問什麼會這樣那?因為我們在mysql中設定了自動認可,但我們也可以改為手動提交。
2、 set autocommit =0; //關閉自動認可
3、 set autocommit =1; //開啟自動認可
六、事務的孤立性(隔離性)
1、在多使用者的時候使用孤立性層級是很重要的,這樣可以保證這些事務互不影響,保證資料庫效能不受到影響。
2、mysql中提供的孤立層級有以下四種:
1)SERIALIZABLE(序列化)
//以序列的形式處理事務,只有事務提交後,使用者才能看到,但是該層級的孤立會影響mysql的效能,因為需要佔用大量的資源,以保證使大量事務在任意時間不被使用者看到。
(2)REPEATABLE READ(可重讀)
// 相比序列化該層級在應用的安全性上做了部分妥協。
3)READ COMMITTED(提交後讀)
// 提交後讀的安全性比可重讀還要低。在這一級的事務,使用者可以看到其他事務添加的新記錄,在交易處理時,如果存在其他使用者同時對事務的相應表進行修改,那麼同一事務在不同時間使用select 查詢得到的結果集可能不同。
(4)READ UNCOMMITTED(未提交讀)
//安全性相比提交後讀就更低,同時該孤立及也是事務之間最小的間隔(孤立程度),該孤立級容易產生虛幻讀操作。其他使用者可以在該孤立級上看到未提交的事務。
3、事務孤立級的查看和修改:
查看:select @@tx_isolation;
修改:set global transaction isolation level 設定的孤立層級;
七、偽事務(鎖定)
1、在MySQL中根據不同的需求,提供了很多儲存引擎,但是有的儲存引擎不支援事務,對於這種情況,可以使用表鎖定來代替事務。
2、對於不支援事務的儲存引擎MYISAM類型資料表,當使用者插入,修改,刪除時,這些操作都會立即儲存到磁碟中,當多使用者同時操作某個表時,可以使用表鎖定來避免同一時間有多個使用者對資料庫中指定表進行操作,這樣可以避免在使用者操作資料表過程中受到幹擾。只有但使用者釋放表的伺服器用戶端檔案鎖後,其他 使用者才可以訪問這些修改的資料表。
這裡的鎖和Java多線程中鎖的作用一樣,個人覺的可以這樣理解。
3、對指定表進行鎖操作的過程:
(1)lock table table-name lock type ; //locktype 有read 和write 兩種
對多個表進行加鎖:
lock table table-name1 lock type, table -name2 lock type ,table -name3 lock type;
(2)在指定的表中進行相應的操作
(3)當使用者完成對鎖定資料表的操作後,進行解鎖。
unlock tables ; //釋放了所有加鎖表的鎖。
、髒讀、不可重複讀取、幻讀概念
髒讀:當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。
不可重複讀取:是指在一個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也訪問該同一資料。那麼,在第一個事務中的兩 次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀取。
幻讀:是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,這種修改涉及到表中的全部資料行。 同時,第二個事務也修改這個表中的資料,這種修改是向表中插入一行新資料。那麼,以後就會發生操作第一個事務的使用者發現表中還有沒有修改的資料行,就好象 發生了幻覺一樣
(4)、髒讀、不可重複讀取、幻讀區別
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/78/65/wKiom1Z7fd2henmAAABFrKcOH6I669.png" title="Screenshot.png" alt="wKiom1Z7fd2henmAAABFrKcOH6I669.png" width="650" style="padding:0px;margin:0px;vertical-align:top;border:none;" />
髒讀是一個事務讀到另一個事務未提交的更新資料,不可重複讀取是一個事務讀到另一個事務已提交的更新資料,幻讀是一個事務讀到另一個事務已提交的新插入的資料
本文出自 “夢想照進現實” 部落格,請務必保留此出處http://lookingdream.blog.51cto.com/5177800/1905789
MySQL 中事務詳解