事務與併發控制
1.事務
事務的概念:
事務是用戶定義 的一個數據庫的操作序列,這些操作要麼全做要麼全不做,是一個不能分割的工作單元,這樣的數據庫的操作序列稱爲事務。
事務的特性:
原子性、一致性、隔離性、持久性,簡稱ACID性。
原子性:
事務是不可分割的工作單元,事務裏面 的操作要麼全做要麼全不做。不能出現事務裏的操作有的執行了,有的沒執行。
原子性示例:
事務T從賬戶A轉100給賬戶B
T:read(A);
A=A-100;
write(A);
read(B);
B=B+100;
write(B);
對於事務T的任意步驟,如果其中有步驟執行失敗的,那其他步驟即使成功也要回退,事務執行失敗。就是通常說的,一榮俱榮,一損俱損。
一致性:
事務執行時要保持數據庫的一致性。即事務執行完畢後,要保證數據
什麼是不一致?
還是上面的事務T,比如事務T未執行前,賬戶A=1000;賬戶B=2000;
執行完write(A)後,系統故障了,這就導致賬戶A少了100,但是B卻沒有增加100。這種狀態就是不一致。
隔離性:
不同事務互不干擾,即使是併發執行的事務,一個事務內部如何執行,也不能被其他事務看到。
隔離性怎麼體現的?
如果事務A執行到B=B+100;但是B並沒有寫回數據庫的時候,出現了數據庫的暫時不一致,事務T2開始讀取A和B,那結果是900+2000=2900;那麼事務T2基於不一致的值對A和B進行操作,是會出大問題 的。所以隔離性要求事務T沒執行完的時候,其他事務看不到T內部的東西,也就是說,在T操作A,B的時候,其他事務不能訪問事務T產生的中間結果,直到T結束掉。這樣可以解決一部分問題,但是仍然不夠。
持久性:
事務執行完畢後,它對數據庫的改變是永久的,就是說如果事務更新了數據,那數據應該被寫在外存上。
持久性的 體現?
事務T對A和B的操作結果,應該被記錄到數據庫裏,而且數據庫應該是保存在磁盤上,而不是臨時內存區。這樣當T結束後,它對數據A和B的修改是永久的,其他事務再訪問A和B,也讀到的是事務T改變後的A和B.
事務的狀態:
活躍狀態:
表示事務正在進行,事務一旦開始就進入了活躍狀態。
部分提交狀態:
操作全部完成後,但是輸出還在臨時內存上,此時是部分提交狀態。
失敗狀態:
事務執行時出故障,進入失敗狀態。
中止狀態:
事務失敗後,數據庫管理系統會恢復被事務影響的 數據(回滾),然後進入中止態
提交狀態:
事務成功,把數據輸出到永久內存上了,這是提交狀態。
事務中止後:
1.重啓事務:事務本身並沒有錯,可以重啓,但被當成新事務。
2.殺死事務:事務有嚴重的錯誤,需要殺死該事務。
2.併發控制
3.併發調度串行化
4.基於鎖的協議
5.兩階段鎖協議
6.多粒度封鎖