概述:
事務是由一系列陳述句構成的邏輯作業單元,事務和存盤程序等批處理有一定程度上的相似之處,
通常都是為了完成一定業務邏輯而將一潭訓者多條陳述句“封裝”起來,使它們與其他陳述句之間出現一個邏輯上的邊界,并形成相對獨立的一個作業單元,
當使用事務修改多個資料表時,如果在處理的程序中出現了某種錯誤,例如系統死機或突然斷電等情況,則回傳結果是資料全部沒有被保存,
因為事務處理的結果只有兩種:一種是在事務處理的程序中,如果發生了某種錯誤則整個事務全部回滾,使所有對資料的修改全部撤銷,事務對資料庫的操作是單步執行的,當遇到錯誤時可以隨時回滾;
另一種是如果沒有發生任何錯誤且每一步的執行都成功,則整個事務全部被提交,從而可以看出,有效地使用事務不但可以提高資料的安全性,還可以增強資料的處理效率,
MySQL 事務主要用于處理操作量大,復雜度高的資料,比如說,在人員管理系統中,你洗掉一個人員,你既需要洗掉人員的基本資料,也要洗掉和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作陳述句就構成一個事務!
- 在 MySQL 中只有使用了 Innodb 資料庫引擎的資料庫或表才支持事務,
- 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 陳述句要么全部執行,要么全部不執行,
- 事務用來管理 insert,update,delete 陳述句
事務包含四種重要的屬性,被統稱為ACID(指資料庫事務正確執行的四個基本要素的縮寫)
包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),
一個支持事務(Transaction)的資料庫,必須要具有這四種特性,
否則在事務程序(Transaction processing)當中無法保證資料的正確性,交易程序極可能達不到交易方的要求,一個事務必須通過ACID,
1、原子性:
整個事務中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環節,
事務在執行程序中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣,
2、一致性:
一個事務可以封裝狀態改變(除非它是一個只讀的),
事務必須始終保持系統處于一致的狀態,不管在任何給定的時間并發事務有多少,
也就是說:如果事務是并發多個,系統也必須如同串行事務一樣操作,
其主要特征是保護性和不變性(Preserving an Invariant),以轉賬案例為例,假設有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元
如果在這個5個賬戶之間同時發生多個轉賬,無論并發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性,
3、隔離性
隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作,
如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統,
這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一資料,
4、持久性
在事務提交完成以后,該事務對資料庫所做的更改便持久的保存在資料庫之中,永久保存下來,并不會被回滾,
5、說明
由于一項操作通常會包含許多子操作,而這些子操作可能會因為硬體的損壞或其他因素產生問題,要正確實作ACID并不容易,
ACID建議資料庫將所有需要更新以及修改的資料一次操作完畢,但實際上并不可行,
目前主要有兩種方式實作ACID:第一種是Write ahead logging,也就是日志式的方式(現代資料庫均基于這種方式),第二種是Shadow paging,
相對于WAL(write ahead logging)技術,shadow paging技術實作起來比較簡單,消除了寫日志記錄的開銷恢復的速度也快(不需要redo和undo),
shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,而且以塊為單位,很難應用到允許多個事務并發執行的情況——這是它致命的缺點,
WAL 的中心思想是對資料檔案 的修改(它們是表和索引的載體)必須是只能發生在這些修改已經 記錄了日志之后,也就是說,在日志記錄沖刷到永久存盤器之后,
如果我們遵循這個程序,那么我們就不需要在每次事務提交的時候 都把資料頁沖刷到磁盤,因為我們知道在出現崩潰的情況下,
我們可以用日志來恢復資料庫:任何尚未附加到資料頁的記錄都將先從日志記錄中重做(這叫向前滾動恢復,也叫做 REDO) 然后那些未提交的事務做的修改將被從資料頁中洗掉 (這叫向后滾動恢復 - UNDO),
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/87436.html
標籤:MySQL
