顯示異常可前往檢視
相信用過mysql的朋友都知道事務,我們也常常通過這個例子來講解事務的作用:a向b轉賬,這裡可以分為兩步運算元據庫,a賬戶餘額減少,b賬戶餘額增加。但是,如果在a賬戶餘額減少的時候突然出現了資料庫宕機了等情況,是不是會出現a的餘額變少了,但是b的餘額卻沒有增加的情況呢?答案是否定的。原因就是資料庫支援事務(常用的關係型資料,如mysql、oracle等)。
事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
這個是乙個老生常談的問題,面試中也經常會問:事務的acid特性分別是什麼?這裡的acid分別代表四個單詞:原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。
1 、原子性。事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2 、一致性。事 務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統 執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性。乙個事務的執行不能受其它事務干擾。即乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性。也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
說事務隔離級別之前,先看看如下問題:
1、髒讀(dirty read)
所謂髒讀是指乙個事務中訪問到了另外乙個事務未提交的資料。如a事務對一條資料進行了修改,但是事務還沒提交,此時b事務讀到了a事務修改了但是未提交的資料,這就是髒讀。
2、不可重複讀(non-repeatable read)
是指在乙個事務內,多次讀同一資料。在這個事務還沒有結束時,另外乙個事務也訪問該同一資料。那麼,在第乙個事務中的兩 次讀資料之間,由於第二個事務的修改,那麼第乙個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在乙個事務內兩次讀到的資料是不一樣的,因此稱為是不 可重複讀。
3、幻讀(phantom read)
所謂幻讀是指同乙個事務內多次查詢返回的結果集不一樣(比如增加了或者減少了行記錄)。比如同乙個事務a內第一次查詢時候有n條記錄,但是第二次同等條件下查詢卻又n+1條記錄,這就好像產生了幻覺,為啥兩次結果不一樣那。其實和不可重複讀一樣,發生幻讀的原因也是另外乙個事務新增或者刪除或者修改了第乙個事務結果集裡面的資料。不同在於不可重複讀是同乙個記錄的資料內容被修改了,幻讀是資料行記錄變多了或者少了
了解了如上幾個問題之後,我們再來看看四種事務隔離級別。
1、read uncommitted(讀取未提交內容)
在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀。
2、read committed(讀取提交內容)
這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。這就是所謂的不可重複讀(non-repeatable read)。
3、repeatable read(可重讀)
這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。
4、serializable(序列化)
這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
除了效能最差的serializable(序列化)隔離級別不會出現髒讀、不可重複讀、幻讀問題之外,其他的隔離級別都存在乙個或多個問題。不過mysql的innodb引擎通過mvcc的方式解決了repeatable read的幻讀問題。
# 檢視當前連線的隔離級別
select @@session.tx_isolation;
# 檢視全域性的事務隔離級別
select @@global.tx_isolation;
1、全域性修改
在mysql的配置檔案上修改,如windows的mysql.ini,linux為my.cnf。
#可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.
[mysqld]
transaction-isolation = repeatable-read
2、通過命令對當前連線設定
# 可選引數為:read uncommitted、read committed、repeatable read、serializable
set session transaction isolation level ***
如何理解資料庫事務隔離級別
總的說,資料庫事物無非就兩種 讀取事物 select 修改事物 update,insert 在沒有事物隔離控制的時候,多個事物在同一時刻對同一 資料的操作可能就會影響到最終期望的結果,通常有四種情況 1 兩個更新事物同時修改一條資料時,很顯然這種情況是最嚴重的了,程式中無論如何也不能出現這種情況,因...
理解資料庫之事務與其隔離級別
一 事務的四大特性 原子性原子性是指事務包含的操作要麼全部成功,要麼全部失敗回滾。一致性一致性是指事務必須使資料庫從乙個一致性狀態變換為另乙個一致性狀態,也就是說事務執行之前和執行之後都必須處於一致性狀態。以a b兩個使用者轉賬為例,無論如何轉賬,兩個使用者的總金額和是不變的。隔離性隔離性是指當多個...
徹底理解資料庫事務
事務 transaction 一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在計算機術語中,事務通常就是指資料庫事務。乙個資料庫事務通常包含對資料庫進行讀或寫的乙個操作序列。它的存在包含有以下兩個目的 1 為資料庫操作提供了乙個從失敗中恢...