事務的原子性

2021-07-11 03:10:24 字數 1951 閱讀 8508

事務的原子性指的是,事務中包含的程式作為系統的邏輯工作單位,它所做的對資料修改操作要麼全部執行,要麼完全不執行。這種特性稱為原子性。原子性的意義是資料庫系統的基礎。

也許有的人想大多數程式設計師都沒有需求去寫要求超長時間高穩定性、高健壯性執行的程式。我想這是不負責任的想法。不管你寫的是動態**、嵌入式控制、移動程式、桌面軟體還是別的什麼,穩定性、健壯性、容錯性和排錯性都應是程式設計師努力做好的本職工作。對我這種寫遊戲軟體的更是如此。會出莫名其妙問題的單機、網遊都能趕走大批玩家。

事務原子性這一點我也是最近改一些

bug感悟出了點頭緒,才成本文。程式設計師手頭都有很多現成的理論做編碼依據,資料結構、演算法、設計模式……有經驗的程式設計師帶領乙個團隊寫出的程式也許不會有大的問題,不過畢竟程式設計師也是會犯錯誤的人,百密難免一疏。隱蔽

bug經常讓人防不盛防。

先說明一下什麼是我所想的事務原子性問題。和資料庫系統對事務原子性的定義差不多一樣,一些邏輯操作是乙個整體,要麼完全成功,要麼完全失敗。但可惜我們不能拿幾段**所表達的抽象邏輯去要求計算機作為運算單元,

cpu一步步的執行指令,我們始終無法完全保證這幾段**的原子性,你寫出在邏輯上再多麼滴水不漏的程式也抵擋不住猛然斷電對邏輯做出的不可回滾和恢復的中斷。所以對於事務原子性我們只能盡量考慮邏輯上的,物理上的無法保證只能盡力而為。關於原子性問題有如下五個要點。

一、簡單事務。邏輯上不易或不能進一步細分的事務。

二、伴隨事務。兩個或兩個以上弱相似度簡單原子事務,我們可以說某個原子事務是伴隨另外的原子事務的。例:玩家吃了補血藥後,藥品數量減少、玩家血量回公升這兩個就是伴隨事務,不能少了藥不回血。

三、集合事務。兩個或兩個以上強相似度簡單原子事務所組成的集合。例:玩家放了群體補血技能後所有在隊伍裡的人物都要回血。

四、流程事務。兩個或兩個以上有先後邏輯順序依賴的簡單原子事務。例:玩家放了眩暈攻擊,對方除了被攻擊時要傷血,還要持續一段時間眩暈狀態。

五、綜合事務。有限次以上四種事務的組合。

看到這也許你大失所望,想也不過如此嘛。的確順著想很容易,除非寫**時走神了否則減了藥沒回血的問題是不會出現的,即使出現了,這種

bug也是好重現好排查修改的。但正常情況下表現不出

bug不代表**嚴謹,邏輯中途遇到非期望資料的情況也要考慮。此時最重要的還要考慮事務可回滾,比如載入乙個資料檔案建立一些邏輯物件,但處理到資料中間突然發現資料出了問題,這時千萬不要把異常情況吞掉,要麼對有問題的資料做記錄和報告並略過,要麼讓整個邏輯失敗並回滾前面已經正常執行的操作。異常情況處理不當往往造成一些非常隱蔽的

bug,像幽靈一樣若隱若現卻如影隨形。能簡單歸納的問題都容易簡單避免。要想保證事務原子性,在寫**時讓自己頭腦裡有強烈的上面五點意識,在敲擊鍵盤時能條件反射一樣注意並規避即可。要保證程式健康,我想有下面幾點。

一、保證事務原子性、可回滾性。參考上面五種原子事務。特別注意多執行緒這種流程不可控的邏輯間不要安插過多原子事務,不然會發現原子事務中斷和回滾都會特別麻煩。

二、容錯性。非常無關緊要的異常情況可以忽略掉,保證程式主要邏輯沒有問題。

三、不吃異常。如果原子性和可回滾性不容易保證,那就把出錯點的資訊盡量詳細的記錄並報告,不要把異常吃了不吭聲,否則那就是隱蔽

bug的根源。把實在無法規避的問題像斷言一樣報告出來中斷掉也比默不作聲強。

四、

kiss

keep it ******, stupid!

即使異常被吃掉了,簡單的**也比錯綜複雜的容易

debug。

事務原子性的重要程度足以寫到每個團隊的編碼規範裡,成為程式設計師潛意識的一部分。下次在寫一段**,甚至可能是乙個

for迴圈時,都要想一下中途失敗該如何應對。**質量說的容易做到難。好的**的爛的**都是長期積累的結果。

事務的原子性

a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 1.從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。2.在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在則...

mysql原子性 MySQL事務的原子性

一 事務的acid特性 1 原子性 2 一致性 3 隔離性 4 永續性 二 對於事務的原子性 a 我們知道事務中的操作要麼都做要麼都不做。對於這一點許多人有錯誤的理解,我們來看乙個例子 1 mysql select from t4 id name 1 a 2 b 3 c 3 rows in set ...

事務的原子性與提交區別

事務的原子性 事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做 要實現事務的原子性,單單靠一條commit或是rollback命令還是不行的,因為例如 commit命令它只是將乙個事務中執行成功的dml語句提交給資料庫裡。如果要實現 事務的原子性 則就需要commit和rollba...