事務(transaction)是由一系列對系統中資料進行訪問與更新的操作所組成的乙個程式執行線邏輯單元;是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。乙個邏輯工作單元要成為事務,必須滿足所謂的acid(原子性、一致性、隔離性和永續性)屬性。
李雷向韓梅梅轉賬100元
李雷和韓梅梅分別在資料庫中有一條記錄,假定李雷賬戶是pk=1 ,有200元; 韓梅梅的賬戶是pk=2,有100元。
一切的資料資源表現為持久的資料儲存。通俗來講所有人的錢只是銀行it系統中資料庫的一條記錄;如果所有銀行的資料丟失並且無法恢復,所有人都的一無所有;真正實現了平等 ?乙個程式設計師開心寫了乙個**,執行在火星人民銀行的系統中:所以這裡涉及了事務的乙個特性「永續性」,資料的狀態在沒有業務觸發的情況下必須持久儲存,不能丟失。
開始
檢視李雷是否有一百元
李雷賬號pk=1減少100元
韓梅梅賬號pk-=2增加100元
結束
在資料庫中李雷賬戶有100元,韓梅梅賬號有200元。
在執行完第二行**「李雷賬號pk=1減少100元」後,火星人民銀行機房停電,第二行沒有繼續執行。系統重啟後查詢資料發現在資料庫中李雷賬戶有100元,韓梅梅賬號有100元。系統中有100元不翼而飛 ?
這裡破壞了事務的「原子性」。發起轉賬後,李雷迫不及待的檢視自己賬戶。當看到自己的賬戶減少了一百塊以後,李雷問**那頭的梅梅:「梅梅,我看我這裡操作成功了,你那裡收到錢了沒?」 。 如果這時候梅梅跟李雷說:"雷~ 我沒看見我賬戶的錢有變化啊「。
這裡事務的「一致性」沒***。其他使用者看到了事務三步操作過程中的中間狀態資訊,這種資訊是明顯反使用者常識的,所以應該盡可能被避免。在李雷給韓梅梅轉賬時,李雷的立即向魏華轉賬200(別問我為什麼,我都不知道魏華是誰)。火星人民銀行的系統再次執行程式設計師「開心」的**,當執行檢視李雷是否有兩百元時,給韓梅梅轉賬的程式還沒有執行完第二行「李雷賬號pk=1減少100元」,所以這時結論是李雷有兩百元,程式繼續執行「李雷賬號pk=1減少200元」。
這裡事務的「隔離性」沒***。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請求,使得在同一時間僅有乙個請求用於同一資料。程式設計師開心非常的不開心,他覺得自己的**沒有問題,在他那裡跑得很正常,無法接收生產上詭異的問題,肯定是大家呼叫的姿勢不對。他去想另乙個程式設計師窮開心傾訴,窮開心一下把問題提公升到信仰的高度。
事務acid特性可能遭到破壞的因素有:
在第一種情況下,系統必須保證多個事務的交叉執行不影響這些事務的原子性;在第二種情況下,必須保證被強行終止的事務對系統和其他事務沒有任何影響。
聽罷,開心茅塞頓開。
然並卵,臣妾做不到啊。。。
參考
MYSQL常見概念一 事務
定義 簡而言之是乙個sql或者是多個sql的操作集,在執行過程中,要麼都成功,要麼都失敗 特點 事務有四大特性 原子性 整個事務包含的sql要麼都執行成功,要麼都失敗 一致性 資料庫在事務執行前與執行後是一致的,資料能夠對的上 隔離性 多個事務之間不相互影 響 永續性 事務一旦完成,對資料庫的影響是...
MySQL事務(一) 事務簡介
事務是資料庫操作的最小工作單元,是一組不可再分割的操作集合,要麼全部執行,要麼全部失敗。在mysql中,事務是一組具有原子性的sql語句,一組 sql 語句要麼全部執行,要麼全部不執行。事務支援是在引擎層實現的,只有使用了 innodb 資料庫引擎的資料庫或表才支援事務,myisam引擎不支援事務,...
一 事務的操作
事務是指使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,它是乙個不可分割的工作單位。乙個事務可以是一條sql語句,一組sql語句,或整個程式。public bool transactionop 開始事務 transaction cn.begintransaction cmd.transa...