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中提供的孤立級别有以下四種:
SQL标準定義了4類隔離級别,包括了一些具體規則,用來限定事務内外的哪些改變是可見的,哪些是不可見的。低級别的隔離級一般支援更高的并發處理,并擁有更低的系統開銷。
Read Uncommitted(讀取未送出内容)
在該隔離級别,所有事務都可以看到其他未送出事務的執行結果。本隔離級别很少用于實際應用,因為它的性能也不比其他級别好多少。讀取未送出的資料,也被稱之為髒讀(Dirty Read)。
Read Committed(讀取送出内容)
這是大多數資料庫系統的預設隔離級别(但不是MySQL預設的)。它滿足了隔離的簡單定義:一個事務隻能看見已經送出事務所做的改變。這種隔離級别 也支援所謂的不可重複讀(Nonrepeatable Read),因為同一事務的其他執行個體在該執行個體處理其間可能會有新的commit,是以同一select可能傳回不同結果。
Repeatable Read(可重讀)
這是MySQL的預設事務隔離級别,它確定同一事務的多個執行個體在并發讀取資料時,會看到同樣的資料行。不過理論上,這會導緻另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另一個事務又在該範圍内插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
Serializable(可串行化)
這是最高的隔離級别,它通過強制事務排序,使之不可能互相沖突,進而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級别,可能導緻大量的逾時現象和鎖競争。
這四種隔離級别采取不同的鎖類型來實作,若讀取的是同一個資料的話,就容易發生問題。例如:
髒讀(Drity Read):某個事務已更新一份資料,另一個事務在此時讀取了同一份資料,由于某些原因,前一個RollBack了操作,則後一個事務所讀取的資料就會是不正确的。
不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中資料不一緻,這可能是兩次查詢過程中間插入了一個事務更新的原有的資料。
幻讀(Phantom Read):在一個事務的兩次查詢中資料筆數不一緻,例如有一個事務查詢了幾列(Row)資料,而另一個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。
在MySQL中,實作了這四種隔離級别,分别有可能産生問題如下所示:

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 ; //釋放了所有加鎖表的鎖。
本文轉自yzy121403725 51CTO部落格,原文連結:http://blog.51cto.com/lookingdream/1905789,如需轉載請自行聯系原作者