數據庫事務的學習筆記

對事務自己的理解

1.事務是一組原子性的SQL查詢,對於事務內的查詢要麼徹底成功,要麼徹底失敗。 mysql

2.mysql默認的事務是自動提交的,即autocommit=true,也就是說一個SQL查詢便是一個事務。 sql

3.對於多條語句,經過start transaction;和commit(rollback)進行配合,將多條語句包裝爲一個更大的事務單元。 數據庫

4.若是設置autocommit=false,那麼語句將不會被提交,直到使用rollback,或者commit。 session

5.事務的特性ACID(原子性,一致性,隔離性,持久性) 異步

   原子性:要求一個事務不可分割,裏面的語句要麼所有成功,要麼所有失敗,不會看到中間狀態。 spa

   一致性:我的感受是數據庫數據自己和數據之間的約束關係在事務先後是不會變的。 日誌

   隔離性:即一個事務在提交以前,他對記錄的修改對其餘事務不可見。爲了防止過多的鎖,MYSQL經過MVCC實現。 圖片

   持久性:即事務對記錄的修改,在提交時候會被永久的保存到磁盤上。MYSQL爲了提升事務效率,存儲引擎在修改數據時一般只修改內存數據,同時將修改操做記錄到「事務日誌」中,再異步的刷回磁盤。 事務

 

對事務隔離級別的理解

Read Uncommited  內存

未提交讀,數據庫級別的最低層次,事務會讀到其餘事務未提交的數據。這種事務級別只保證磁盤不出問題。產生的問題即髒讀。

如圖:



 

 左側事務中對age=4的記錄進行了更新可是未提交,右側事務使用uncommited read 讀到了未提交的記錄,使用其餘事務級別則讀到原值。

 

Read Committed

與read uncommitted不一樣,這個級別下的事務讀不到其餘事務未提交的記錄.。這個在上一張圖中就有體現。雖然Read Committed可以保證事務讀到別人提交的記錄,可是仍然存在在同一個事務中,對同一條記錄讀兩次,值發生變化的狀況。即兩次select中有其餘事務對該記錄有更新。這種不一致的狀況,成爲「不可重複讀」

如圖:

 

 

在read committed下右邊session啓動一個事務,第一次查詢age=4的記錄值爲xiaotong,而後左邊對age=4的記錄更新爲myname,右邊事務再查詢時,發現記錄已經變名字了。這就是在一個事務中對一條記錄反覆讀取出現不一致狀況,稱之爲「不可重複讀」

 

Repeatable Read(mysql默認級別)

可重複讀。針對read committed出現的狀況,repeatable read 就是一種在事務內對統一記錄反覆查詢不會出現不一致的事務級別,

如圖:



 

 若是設置右邊事務級別爲repeatable read,那麼不管在事務過程當中,其餘事務如何更改記錄值,右邊事務對統一記錄的查詢結果始終一致。

 

Serializable(序列)

隔離級別最高的一種事務級別,要求不一樣事務之間串行執行,這樣可以保證事務之間沒有任何干擾,可是這樣查詢的效率很低,吞吐量低,需謹慎使用。序列的級別下,是不會存在幻讀的,即在一個事務中,對一批事務進行更新,而在令一個事務中插入了一條新記錄知足條件。這樣更新事務就會發現更新操做在提交以後仍有知足條件而未更新的,稱之爲「幻讀」。

 

事務相關經常使用sql

查詢當前session的事務隔離級別

select @@tx_isolation

 

查看全局事務隔離級別

select @@global.tx_isolation

 

這是session的事務級別

set session(global)  transaction isolation level read uncommitted

(read committed,repeatable read,serializable)

相關文章
相關標籤/搜索