[mysql] 事務

前言

事務是數據庫中很重要的一種機制,做爲一個後臺開發人員,事務是咱們必需要了解的機制。寫下這篇文章,主要是爲了可以加深我對事務的理解,也是爲了之後能夠方便查看。要了解事務,咱們須要關注如下三個大佬: 事務的基本要素 、 事務的併發問題 、 事務的隔離級別 。下面就讓我來依次介紹這三個大佬。mysql

 

事務的基本要素(ACID)

 原子性(Atomicity) :一個事務裏面的一系列操做要麼全作,要麼全不作,事務是不可分割的一個總體。sql

 一致性(Consistency) :事務開始前和結束後,數據庫的完整性約束沒有被破壞。一個事務的中間狀態對外部不可見。好比,A向B轉帳,不可能出現A扣了錢,B卻沒有收到的狀況。數據庫

 隔離性(Isolation) :同一時間只容許一個事物訪問同一個數據,不一樣的事務之間彼此沒有任何干擾。session

 持久性(Durability) :事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。併發

注:原子性是事務隔離的基礎,隔離性和持久性是手段,最終目的是爲了保持數據的一致性。spa

 

事務的併發問題

 髒讀 :事務A讀取了事務B更新的數據,而後事務B回滾了,那麼事務A讀取的數據是髒數據。code

 不可重複讀 :事務A讀取數據d1,事務B對數據d1進行更新操做而且提交了事務B,事務A再次讀取數據d1,那麼事務A第一次和第二次讀取的數據不一致。blog

 幻讀 :事務A查詢id=1的數據,發現沒有,事務b插入了id=1的數據而且提交了事務B,事務A插入id=1的數據報錯,這個時候事務A就產生了幻讀。事務

 

事務隔離級別

  讀未提交(read-uncommitted) :不能夠防止任何的事務併發問題,可是執行效率最高。ci

 讀已提交(read-committed) :可防止髒讀,效率低於讀未提交。

 可重複讀(repeatable-read) :可防止髒讀、不可重複讀,效率低於讀已提交。(注:mysql默認事務隔離級別)

 串行化(serializable) :可防止髒讀、不可重複讀、幻讀,效率最低。

 

數據庫相關操做

查看數據庫隔離級別:

select @@tx_isolation;

設置當前會話的事務隔離級別:

set session transaction isolation level read uncommitted;

 

設置全局的事務隔離級別

set global transaction isolation level repeatable read;
相關文章
相關標籤/搜索