1.首先是事務的概念:是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。舉個例子:比如銀行轉賬問題,A給B轉賬100塊錢,應該是要分為兩步操作,第一顯示A的餘額-100,再就是B的餘額+100,這兩個操作要麼都成功,要不都不能成功,這兩個操作是一個不可拆分的,也就是下面說的原子性。
2.再就是事務的四大特性:原子性,一致性,隔離性,永續性。
3.如果在沒有多執行緒控制機制的情況下,多個事務併發執行,會發生以下幾個問題:
髒讀:A事務讀取資料庫的某條記錄,但是這條記錄是B事務更新未提交的,所以,A事務讀取的資料很可能因為B事務回滾而導致資料不正確。
不可重複讀:A事務連續讀取資料庫的某條已被提交的記錄,但是B事務在A事務讀取的間隙又對該記錄更新並提交了,A事務讀取的多次資料就會不正確。
幻讀:
4.對於處理以上四種情況,有四個級別的處理方案:Read Uncommitted,Read Committed,Repeatable Read,serializable(讀未提交、讀已提交、可重複讀、序列化)
Read UnCommitted:事務的各種問題均無法避免,因為資料庫允許某事物讀取未提交的資料。
Read Committed: 可以防止髒讀,因為資料庫只允許事務讀取的時候讀取已提交的資料,因此資料庫不得不採用鎖,此級別鎖行。
Repeatable Read:可以防止髒讀和不可重複讀問題,因為此級別下某事物讀取資料將會禁止寫資料的其他事務(但允許讀事務),寫事務則禁止任何其他事。
Serializable: 最狠的一種,要求每個事務已序列化的方式進行執行,A事務不結束B事務不能開始,知道A事務完成才行。
注意:四大隔離級別從上到下越來越安全,安全的代價就是效能,為了防止多執行緒事故,資料庫只能加鎖,這就限制了效能,而且還可能出現死鎖,所以
選用隔離級別的候要小心選用。
5.常見資料庫的隔離級別
mysql具有四大隔離級別,預設為Read Committed,設定隔離級別語句為:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
Oracle中只有兩隔離級別:Read Committed和Serializable,預設為Read Committed。