ASP.NET
C#
SQL
TransactionScope
儲存:這份檔案需要先儲存,所以儲存步驟就放我這不要複製再貼上,call我就會處理
陳核:我要儲存!但是儲存前要先存些東西,真的不行複製過來我這嗎?
退回:我也要!我也要!我也要儲存但是需要前處理資料,而且跟陳核處理的部分不一樣耶!
結案:不用擔心我!我只要儲存就好,其他一律不處理跟負責。
刪除:恩… 我應該不用儲存吧?反正儲存完也要刪掉,沒有要保留了不是嗎?
上面的故事,大家有沒有發現了什麼問題點?
沒錯!顯而易見的東西叫做「儲存資料」,而且儲存的邏輯被規定放在某個function裡
即使有其他邏輯、需求需要在儲存前或儲存中作相對應處理,卻不能把儲存邏輯放在其他地方。
:bulb: 要先說明為何不能將儲存方式多放在其他地方的原因 :arrow_down:
兩種差別儲存方式只有在儲存前整理、預先處理一些雜項,但實際上可能有更多資料需要。
而且不只處理,還需要顯示,導致更多因素讓儲存function到處被複製
這樣的缺點,會讓後續接手人員不好改,而且一改動就要從頭審查程式碼!
接下來將以 C# 的 Transaction方式 進行介紹 :arrow_down:
:Memo: TransactionScope建構後可以分別傳入以下三種參數
測試方法詳查 :arrow_right: 點我連結
經過上述的測試方式,結論有以下幾點
:arrow_right: 當外部不Commit時,內部即使Commit也不進行更動。
:A:
可以想像成上圖,當「B交易區塊」被呼叫時,「A交易區塊」已經產生等待中
這時「B交易區塊」會去使用「A交易區塊」,不會去產生新的一份交易區塊
可以視為「B交易區塊」的資料合併到「A交易區塊」內作動
所以整個「A、B交易區塊」皆可看成「A交易區塊」
因此只要「A交易區塊」不Commit,整大段的資料就不會變更
根據以上測試的結論來看,可以整理成下列表來看
TransactionScope選擇 | Commit | (外部Trasaction)Commit | 內部資料更新結果 |
---|---|---|---|
Required | Yes | Yes | 成功 |
Required | No | Yes | 成功 |
Required | Yes | No | 失敗 |
Required | No | No | 失敗 |
RequiredNew | Yes | Yes | 成功 |
RequiredNew | No | Yes | 失敗 |
RequiredNew | Yes | No | 成功 |
RequiredNew | No | No | 失敗 |
Suppress | Yes | Yes | 成功 |
Suppress | No | Yes | 成功 |
Suppress | Yes | No | 成功 |
Suppress | No | No | 成功 |
:ballot_box_with_check:Required時有外部看外部Transaction,沒外部就看內部Transaction
:ballot_box_with_check:RequiredNew就只看內部Transaction
:ballot_box_with_check:Suppress哪邊都不看