事務是訪問並更新資料庫中各種資料項的乙個程式執行單元。在事務中的操作,要麼都執行修改,要麼都不執行,這就是事務的目的,也是事務模型區別於檔案系統的重要特徵之一。
嚴格上來說,事務必須同時滿足4個特性,即通常所說事務的acid特性。雖然理論上定義了嚴格的事務要求,但是資料庫廠商出於各種目的並沒有嚴格滿足事務的acid標準。例如,對於mysql的ndb cluster引擎,雖然支援事務,但是不滿足d的要求,即永續性的要求。對於oracle資料庫來說,其預設的事務隔離級別為read committed,不滿足i的要求,即隔離性的要求。對於innodb儲存引擎而言,預設的事務隔離級別是read repratable,完全遵循和滿足事務的acid特性。
a(atomicity),原子性。原子性指整個資料庫事務是不可分割的工作單位。只有使事務中所有的資料庫操作都執行成功,整個事務的執行才算成功。事務中任何乙個sql語句執行失敗,那麼已經執行成功的sql語句也必須撤銷,資料庫狀態應該退回到事務前的狀態。
c(consistency),一致性。一致性是指事務將資料庫從一種狀態轉變為另一種狀態。在事務的開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。
i(isolation),隔離性。隔離性還有其他的稱呼,如併發控制、可序列化、鎖。事務的隔離性要求每個讀寫事務的物件與其他事務的操作物件能互相分離,即該事務提交前對其他事務都不可見,這通常使用鎖來實現。資料庫系統中提供了一種粒度鎖的策略,允許事務僅鎖住乙個實體物件的子集,以此來提高事務之間的併發度。(如果是全表鎖,事務之間基本就無法實現併發,但是如果只鎖住表中處理的行,可以提高事務的併發度)
d(durability),永續性。事務一旦提交,其結果就是永久性的。即使發生宕機等故障,資料庫也能將資料恢復。需要注意的是,永續性只能從事務本身的角度來保證結果的永久性,如事務提交後,所有的變化都是永久的,即使當資料庫由於崩潰而需要恢復時,也能保證恢復後提交的資料都不會丟失。
事務的(acid)特性是由關聯式資料庫管理系統(rdbms,資料庫系統)來實現的。資料庫管理系統採用日誌來保證事務的原子性、一致性和永續性。日誌記錄了事務對資料庫所做的更新,如果某個事務在執行過程中發生錯誤,就可以根據日誌,撤銷事務對資料庫已做的更新,使資料庫退回到執行事務前的初始狀態。資料庫管理系統採用鎖機制來實現事務的隔離性。當多個事務同時更新資料庫中相同的資料時,只允許持有鎖的事務能更新該資料,其他事務必須等待,直到前乙個事務釋放了鎖,其他事務才有機會更新該資料。
在mysql命令列的預設設定下,事務都是自動提交的,即執行sql語句後就會馬上執行commit操作。因此要顯示的開啟乙個事務必須使用命令begin和start transaction,或者執行命令set autocommit = 0,以禁用當前會話的自動提交。事務控制語句如下:
ansi sql標準定義的四個隔離級別為:
read uncommitted(未提交讀),事務中的修改,即使沒有提交,在其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀。
read committed(提交讀),乙個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀,因為兩次執行相同的查詢,可能會得到不一樣的結果。因為在這2次讀之間可能有其他事務更改這個資料,每次讀到的資料都是已經提交的。
repeatable read(可重複讀),解決了髒讀,也保證了在同乙個事務中多次讀取同樣記錄的結果是一致的。但是理論上,可重讀讀隔離級別還是無法解決另外乙個幻讀的問題,指的是當某個事務在讀取某個範圍內的記錄時,另外乙個事務也在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍內的記錄時,會產生幻行。
serializable(可序列化),它通過強制事務序列執行,避免了前面說的幻讀的問題。
1、髒讀(dirty read):乙個事務可以讀取另乙個尚未提交事務的修改資料。
2、不可重複讀(nonrepeatable read):在同乙個事務中,同乙個查詢在t1時間讀取某一行,在t2時間重新讀取這一行時候,這一行的資料已經發生修改,可能被更新了(update),也可能被刪除了(delete)。
3、幻像讀(phantom read):在同一事務中,同一查詢多次進行時候,由於其他插入操作(insert)的事務提交,導致每次返回不同的結果集。
innodb採用mvcc來支援高併發,並實現了四個標準的隔離級別。其預設級別是repeatable read(可重複讀),並且通過間隙鎖(next-key locking)策略防止幻讀的出現。間隙鎖使得innodb不僅僅鎖定查詢涉及的行,還會對索引中的間隙進行鎖定,以防止幻影的插入。
隔離級別越低,事務請求的鎖越少或保持鎖的時間就越短。所以很多資料庫系統預設的事務隔離級別是read committed。質疑serializable隔離級別的效能,但是innodb儲存引擎認為兩者的開銷是一樣的,所以預設隔離級別使用repeatable read。
用命令設定當前會話或全域性會話的事務隔離級別。
set [global | session] transaction isolation level
如果想啟動時就設定事務的預設隔離級別,修改mysql的配置檔案,在[mysqld]中新增如下行:
[mysqld]
transaction-isolation = read-committed
innodb儲存引擎提供了對於xa事務的支援,並通過xa事務來支援分布式事務的實現。分布式事務指的是允許多個獨立的事務資源參與到乙個全域性的事務中。事務資源通常是關係型資料庫系統,也可以是其他型別的資源。全域性事務要求在其中的所有參與的事務要麼都提交,要麼都回滾,這對於事務的acid要求又有了提高。在使用分布式事務時,innodb儲存引擎的事務隔離級別必須設定成serializale。
xa事務由乙個或多個資源管理器、乙個事務管理器、以及乙個應用程式組成。
在mysql資料庫的分布式事務中,資源管理器就是mysql資料庫,事務管理器為連線到mysql伺服器的客戶端。
分布式事務使用兩段式提交(two-phase commit)的方式。在第一階段,所有參與全域性事務的節點都會開始準備(prepare),告訴事務管理器他們準備好了。第二階段,事務管理器告訴資源管理器執行rollback或commit。如果任何乙個節點顯示不能提交,則所有的節點都會被告知需要回滾。與本地事務不同的是,需要多一次的prepare操作,待收到所有節點的同意資訊後,再進行commit或rollback操作。
mysql 事務 執行原理 概述
以前沒有深究過資料庫底層是怎麼運作的,只是停留在了概念層次,但是後來發現寫程式的時候不是很舒服,總感覺有些點不通,於是決定看看mysql innodb引擎的原理,這裡只是乙個大致的介紹,不會太深入。如果我們在mysql的客戶端執行了一些個操作,我們不了解任何底層,最簡單的概念模型就是認為資料庫的表裡...
MYsql事務概述及控制語句
一 事務概述 1 原子性 事務中所有的操作視為乙個原子單元,即對於事務所進行的資料修改等操作只能是完全提交或者完全回滾。2 一致性 事務在完成時,必須使所有的資料從一種一致性狀態變更為另外一種一致性狀態,所有的變更必須應用於事務的修改,以確保資料的完整性。3 隔離性 乙個事務中的操作語句所做的修改必...
Spring事務概述
1 什麼是事務 邏輯上的一組操作,組成這組操作的各個單元,要麼全成功,要麼全失敗 2 事務的特性 1.原子性 事務不可分割 2.一致性 事務執行前後資料完整性保持一致 3.隔離性 乙個事務的執行不應該受到其他事務的干擾 4.永續性 一旦事務結束,資料就持久化到資料庫 3 如果不考慮隔離性引發安全性問...