我發現這個great article關於表適配器的交易。但是,這篇文章並沒有解釋爲什麼交易是需要的甚至是理想的!我是否需要使用c#TableAdapter進行數據庫事務?
爲什麼值得我嘗試與我的TableAdapter一起實現事務?
我發現這個great article關於表適配器的交易。但是,這篇文章並沒有解釋爲什麼交易是需要的甚至是理想的!我是否需要使用c#TableAdapter進行數據庫事務?
爲什麼值得我嘗試與我的TableAdapter一起實現事務?
假設在保存對數據庫進行多次查詢時發生的事情發生了問題。當您開始保存操作時,您想要保存的所有數據都會發生什麼?大多數開發人員想要使之前保存的數據無效。 嗯..這就是交易的目的:你將所有的保存邏輯封裝在一個事務中,這樣如果/當中間發生不好的事情時,什麼都不會被保存。
「爲什麼」將執行的數據庫操作作爲一個更廣泛的交易單元的一部分,這樣就可以提交這個和其他的東西在原子(全 - 或 - 無)的方式,或確保您的讀取和寫入發生在同一個事務中(以避免幻象/不可重複讀取)。其實我不是適配器型號的巨大粉絲,但...
對於如何; TransactionScope
會更簡單,因爲ADO.NET連接應自動招募:
using(var tran = new TransactionScope()) {
// do work A
// do work B
// do work C
tran.Complete();
}
完成任務......
不幸的是,由於數據庫的配置,我不能使用TransationScopes,因爲它們會提升多個Transaction動作分散。所以它看起來就像它對我來說長久而痛苦的「部分班級」方法! – 2010-11-04 11:37:48
交易可以維護數據庫數據的一致性。通常最好在所有數據庫更新/插入中引入事務。出於任何原因,如果指定的存儲過程失敗,則總是回滾。
如果你有一個情況,你有多個表,你想在原子調用中有一個保證更新,交易使這成爲可能。如果沒有事務處理,您可能會更新一個表格,然後第二個表格會失敗,您將留下問題數據。 例如,您可能會遇到這樣的情況:yuo有一個屏幕,並且想要通過單擊一個按鈕添加父記錄和一堆子記錄。如果沒有交易,父母會成功保存,但其中一個孩子記錄會爆炸。通過事務處理,您可以回滾整個事務並請求用戶修復數據問題。
這些你們在這裏發佈的信息對我來說聽起來不錯,但我們不應該忘記,對於一個解決方案來說,總是有利和不利的 例如管理應用程序方面的交易(無所謂)要增加網絡流量,因爲.NET必須發送所有的命令到SQL Server:使用(VAR TRAN =新的TransactionScope()){
// do work A
// do work B
// do work C
tran.Complete();
}
在這它必須發送「開始事務」和「提交」。
最糟糕的想法是如果在「//工作b」之後連接被切斷,會發生什麼?這意味着.Net將無法發送「回滾」或「提交」,因此我們將在SQL Server端打開可導致死鎖的事務。
您是否在查找有關交易目的的文檔? – 2010-11-04 10:34:04
目的和一般良好做法將非常有幫助。 – 2010-11-04 10:36:29
是的,你可以在交易中介紹後自行回答http://en.wikipedia.org/wiki/Database_transaction – Danil 2010-11-04 10:37:01