什麼是事務
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務必須服從iso/iec所制定的acid原則。acid是原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)的縮寫,這四種狀態的意思是:
1、原子性
即不可分割,事務要麼全部被執行,要麼全部不執行。如果事務的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生變化;如果有子事務失敗,則其他子事務的資料庫操作被回滾,即資料庫回到事務執行前的狀態,不會發生狀態轉換
2、一致性
事務的執行使得資料庫從一種正確狀態轉換成另外一種正確狀態
3、隔離性
在事務正確提交之前,不允許把事務對該資料的改變提供給任何其他事務,即在事務正確提交之前,它可能的結果不應該顯示給其他事務
4、永續性
事務正確提交之後,其結果將永遠儲存在資料庫之中,即使在事務提交之後有了其他故障,事務的處理結果也會得到儲存
事務的作用
事務管理對於企業級應用而言至關重要,它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後台資料的完整性。就像銀行的自動提款機atm,通常atm都可以正常為客戶服務,但是也難免遇到操作過程中及其突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過atm機一樣,以保證使用者和銀行的利益都不受損失。
併發下事務會產生的問題
舉個例子,事務a和事務b操縱的是同乙個資源,事務a有若干個子事務,事務b也有若干個子事務,事務a和事務b在高併發的情況下,會出現各種各樣的問題。"各種各樣的問題",總結一下主要就是五種:第一類丟失更新、第二類丟失更新、髒讀、不可重複讀、幻讀。五種之中,第一類丟失更新、第二類丟失更新不重要,不講了,講一下髒讀、不可重複讀和幻讀。
1、髒讀
所謂髒讀,就是指事務a讀到了事務b還沒有提交的資料,比如銀行取錢,事務a開啟事務,此時切換到事務b,事務b開啟事務-->取走100元,此時切換回事務a,事務a讀取的肯定是資料庫裡面的原始資料,因為事務b取走了100塊錢,並沒有提交,資料庫裡面的賬務餘額肯定還是原始餘額,這就是髒讀。
2、不可重複讀
所謂不可重複讀,就是指在乙個事務裡面讀取了兩次某個資料,讀出來的資料不一致。還是以銀行取錢為例,事務a開啟事務-->查出銀行卡餘額為1000元,此時切換到事務b事務b開啟事務-->事務b取走100元-->提交,資料庫裡面餘額變為900元,此時切換回事務a,事務a再查一次查出賬戶餘額為900元,這樣對事務a而言,在同乙個事務內兩次讀取賬戶餘額資料不一致,這就是不可重複讀。
3、幻讀
所謂幻讀,就是指在乙個事務裡面的操作中發現了未被操作的資料。比如學生資訊,事務a開啟事務-->修改所有學生當天簽到狀況為false,此時切換到事務b,事務b開啟事務-->事務b插入了一條學生資料,此時切換回事務a,事務a提交的時候發現了一條自己沒有修改過的資料,這就是幻讀,就好像發生了幻覺一樣。幻讀出現的前提是併發的事務中有事務發生了插入、刪除操作。
什麼是事務
事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務必須服從iso/iec所制定的acid原則。acid是原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)的縮寫,這四種狀態的意思是:
1、原子性
即不可分割,事務要麼全部被執行,要麼全部不執行。如果事務的所有子事務全部提交成功,則所有的資料庫操作被提交,資料庫狀態發生變化;如果有子事務失敗,則其他子事務的資料庫操作被回滾,即資料庫回到事務執行前的狀態,不會發生狀態轉換
2、一致性
事務的執行使得資料庫從一種正確狀態轉換成另外一種正確狀態
3、隔離性
在事務正確提交之前,不允許把事務對該資料的改變提供給任何其他事務,即在事務正確提交之前,它可能的結果不應該顯示給其他事務
4、永續性
事務正確提交之後,其結果將永遠儲存在資料庫之中,即使在事務提交之後有了其他故障,事務的處理結果也會得到儲存
事務的作用
事務管理對於企業級應用而言至關重要,它保證了使用者的每一次操作都是可靠的,即便出現了異常的訪問情況,也不至於破壞後台資料的完整性。就像銀行的自動提款機atm,通常atm都可以正常為客戶服務,但是也難免遇到操作過程中及其突然出故障的情況,此時,事務就必須確保出故障前對賬戶的操作不生效,就像使用者剛才完全沒有使用過atm機一樣,以保證使用者和銀行的利益都不受損失。
併發下事務會產生的問題
舉個例子,事務a和事務b操縱的是同乙個資源,事務a有若干個子事務,事務b也有若干個子事務,事務a和事務b在高併發的情況下,會出現各種各樣的問題。"各種各樣的問題",總結一下主要就是五種:第一類丟失更新、第二類丟失更新、髒讀、不可重複讀、幻讀。五種之中,第一類丟失更新、第二類丟失更新不重要,不講了,講一下髒讀、不可重複讀和幻讀。
1、髒讀
所謂髒讀,就是指事務a讀到了事務b還沒有提交的資料,比如銀行取錢,事務a開啟事務,此時切換到事務b,事務b開啟事務-->取走100元,此時切換回事務a,事務a讀取的肯定是資料庫裡面的原始資料,因為事務b取走了100塊錢,並沒有提交,資料庫裡面的賬務餘額肯定還是原始餘額,這就是髒讀。
2、不可重複讀
所謂不可重複讀,就是指在乙個事務裡面讀取了兩次某個資料,讀出來的資料不一致。還是以銀行取錢為例,事務a開啟事務-->查出銀行卡餘額為1000元,此時切換到事務b事務b開啟事務-->事務b取走100元-->提交,資料庫裡面餘額變為900元,此時切換回事務a,事務a再查一次查出賬戶餘額為900元,這樣對事務a而言,在同乙個事務內兩次讀取賬戶餘額資料不一致,這就是不可重複讀。
3、幻讀
所謂幻讀,就是指在乙個事務裡面的操作中發現了未被操作的資料。比如學生資訊,事務a開啟事務-->修改所有學生當天簽到狀況為false,此時切換到事務b,事務b開啟事務-->事務b插入了一條學生資料,此時切換回事務a,事務a提交的時候發現了一條自己沒有修改過的資料,這就是幻讀,就好像發生了幻覺一樣。幻讀出現的前提是併發的事務中有事務發生了插入、刪除操作。
資料庫隔離級別
1、未提交讀(read uncommitted)
事務中的修改及時沒提交也會被其他事務可見,這樣會產生髒讀,如果事務失敗回滾,則其他事務之前的到的資料則是髒資料。從效能上講,不會別別的事務提高太多,但是極其不安全。
2、讀提交(read committed)
又可叫不可重複讀,大多數資料庫預設的隔離模式(mysql不是)。在事務完成提交之前,其他事務看不到該事務的修改結果。執行兩次同樣的查詢可能看到不一樣的結果。
3、重複讀(repeatable read)
事務a讀取與搜尋條件相匹配的若干行。事務b以插入或刪除行等方式來修改事務a的結果集,然後再提交。事務a再讀取時,卻發現資料發生了變化。造成了幻讀。(mysql預設的隔離級別)
4、序列化(serializable)
serializable是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。
資料庫事務及隔離級別
1資料庫四大特性 資料庫具有事務安全性,同時也具有acid四大特性 原子性 一致性 隔離性 永續性 原子性 atomicity 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能...
資料庫事務及隔離級別
1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事務開始前和...
資料庫事務及隔離級別
a.概念 b.操作 c.測試 建立賬戶表 create table account id int primary keyauto increment name varchar 10 money double 新增資料 insert into account name,money values zha...