MySQL事務和隔離級別

事務是什麼

    一個大的處理單元,包含多項操作,涉及多次cpu和io操作,這些操作同時完成或同時不完成,即這個大的處理單元中的操作是一個整體,只有全部執行完畢,才進行提交。一般啓動事務的是SQL語句,或是ODBC中專門啓動事務的語句

事務的性質(應遵循的規則,ACID)

  • 原子性(Atomicity):整個事務中的所有操作,要麼全部完成,要麼全部不完成,不能停滯在中間某個環節,整個事務的所有操作是不可分割的,所以事務在執行過程中若發生錯誤,應回滾到事務開始前的狀態,就像這個事務從來沒有執行過一樣

  • 一致性(Consistency):事務執行必定會引起數據庫狀態改變,一致性表示,事務開始到事務結束,數據庫的整體狀態是沒有改變的

  • 隔離性(Isolation):事務並行執行時,確保每一事務在系統中認爲只有該事務在使用系統,事務彼此間互不影響

  • 持久性(Durability):在事務完成以後,該事務所對數據庫所作的更改會持久的保存在數據庫之中,通過寫入日誌文件當中

事務日誌

    事務記錄到事務日誌文件中,最後再寫入磁盤中(例如DELECT操作,有四個語句,四個語句執行都是在內存中完成,並且先記錄到日誌中,當整個操作完成,再從日誌文件對數據文件進行修改)所以每個事務執行過程中都要寫入兩遍,一遍到日誌,一遍到真實文件(日誌記錄的是操作過程,而非操作本身)

事務併發執行時需要進行併發控制,加鎖是其中一種方式,也是一種重要的機制

鎖分類

  • 讀鎖:共享鎖(讀的同時允許其他事務讀)

  • 寫鎖:獨佔鎖/排它鎖(寫的同時不允許其他事務讀和寫)

鎖粒度:鎖粒度從大到小,粒度越細越能實現併發性,但實現機制越複雜

(mysql server僅支持表級鎖,行鎖需要存儲引擎完成)

  • 表鎖

  • 行鎖

隔離級別:由低到高,隔離級別越高,併發能力越低

  • READ UNCOMMITTED:讀未提交:所有事務都可以看到其他事務操作結果,各種混亂

  • READ COMMITTED:讀提交:事務在其他事務操作完提交後,才能看到其他事務的操作(我讀了一次,再次讀的時候已經被別人提交了,兩次讀的不一樣)

  • REPATABLE READ:可重讀:事務第一次讀到什麼,一直到提交的時候都是那樣,即使其他事務在這個過程中對相同的內容操作並提交,也不會改變本事務讀到的東西(提交後發現應該是10行現在變成了5行,可能別人在你沒提交的時候修改並提交了)(mysql默認)

  • SERIALIZABLE:可串行,簡單地說,事務不可同時執行






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章