2012-11-07 41 views
0

可能重複:
Transactions in .net交易在.NET中使用C#

我只是想了解一下使用C#語言.NET事務。我在網上瀏覽過不同的文章。然而,我從理論上了解交易,但我想實時瞭解交易的確切用途。例如,我何時應該實時使用交易。假設我正在編寫代碼,我正在對鏈接的點擊事件進行一些操作。比方說,我打SQL連接來獲取一些值。我應該在那裏使用交易嗎?如果我正在編寫簡單的代碼,在不使用sql連接的情況下獲取值,我應該在那裏使用事務嗎?使用交易有什麼優點和缺點?獲得理論知識是不同的,但我想知道它的確切用途。何時何時不使用。交易可以使用簡單的代碼嗎?任何有關交易的基本內容的反應或鏈接都是受歡迎的。

+0

Plesae將示例代碼與您的解釋一起發佈。這將有助於瞭解更多。謝謝 –

回答

1

我點擊SQL連接來獲取一些值。我應該在那裏使用 交易嗎?

不,不需要使用事務,當您不在數據庫中更改數據時。

使用交易有什麼優點和缺點。

正如您所說,您已經瞭解了各種文章,因此可能您已經弄清楚了使用這些交易的原因。看看所有這些與數據庫有關的問題。

通過事務處理系統,三層應用程序在創建可伸縮和健壯的應用程序中的優勢變得可行。將事務服務器處理的另一個優點是,可以將組成應用程序的組件分佈到單獨的服務器中,而無需爲該體系結構進行顯式開發。事務處理系統還確保事務是原子性的,一致的,隔離的和持久的。這可以緩解開發人員不必明確支持這些特性。

Why Do We Need Transaction Processing?
The Advantages Of Transaction Processing

可交易簡單的代碼中使用?

是的,您可以簡單地使用ADO.Net在C#中編寫代碼。 (例如SQLTransaction類)

例如

SqlConnection db = new SqlConnection("connstringhere"); 
     SqlTransaction transaction; 

     db.Open(); 
     transaction = db.BeginTransaction(); 
     try 
     { 
     new SqlCommand("INSERT INTO TransactionDemo " + 
      "(Text) VALUES ('Row1');", db, transaction) 
      .ExecuteNonQuery(); 
     new SqlCommand("INSERT INTO TransactionDemo " + 
      "(Text) VALUES ('Row2');", db, transaction) 
      .ExecuteNonQuery(); 
     new SqlCommand("INSERT INTO CrashMeNow VALUES " + 
      "('Die', 'Die', 'Die');", db, transaction) 
      .ExecuteNonQuery(); 
     transaction.Commit(); 

參考:
Performing a Transaction Using ADO.NET
.NET 2.0 transaction model

0

參考這篇文章:

http://www.codeproject.com/Articles/10223/Using-Transactions-in-ADO-NET

這將回答你關於交易的問題。

+3

Vasnth,你不應該只是給另一個網站的鏈接作爲答案,因爲該網站可能會在未來過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:meta.stackoverflow.com/q/8259 –

0

交易的本質是確保代表單個進程的一個或多個變化到數據庫一次,如果其中一個出現故障,其他的應被顛倒。如果您將資金從一個銀行賬戶轉移到另一個銀行賬戶,則從一個賬戶中扣除和存入其他賬戶必須完全成功。否則,這筆錢將在運輸途中丟失

using(SqlConnection conn = new SqlConnection()) 
{ 
    try 
    { 
    conn.Open(); 
    SqlTransaction tran = conn.BeginTransaction(); 

    //command to remove from account A 
    //command to deposit into account B 

    tran.Commit(); //both are successful 
    } 
    catch(Exception ex) 
    { 
     //if error occurred, reverse all actions. By this, your data consistent and correct 
     tran.Rollback(); 
    } 
} 

另一種選擇是TransactionScopeSystem.Transactions

0

通常你作爲最建議或許應該使用TransactionScope,雖然這也確實會帶來一些位需要注意的。

using(TransactionScope ts = TransactionUtils.CreateTransactionScope()){ 
    using(SqlConnection conn = new SqlConnection(connString)){ 
    conn.Open(); 
    using(SqlCommand cmd = new SqlCommand("DELETE FROM tableName WHERE somethingorother", conn)){ 
    cmd.... 

    } 
    using(SqlCommand cmd ....) ... 
    thingy.Save();//uses another command/connection possibly 
    } 

//all above Sql Calls will be done at this point. all or nothing 
    ts.Complete(); 
} 

取決於如何使用它(和什麼DB /版本您正在使用),TransactionScope可能升級交易到MSDTC,這將需要在機器上設置運行的應用程序(從運行提示DCOMCNFG) 。 (TransactionScope automatically escalating to MSDTC on some machines?

也值得擁有的這 http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx 讀,而不是茫然地使用新的TransactionScope() - 該文章建議制定一個靜態方法來生成一個與一些更有幫助的默認值。

public class TransactionUtils { 
    public static TransactionScope CreateTransactionScope() 
    { 
    var transactionOptions = new TransactionOptions(); 
    transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted; 
    transactionOptions.Timeout = TransactionManager.MaximumTimeout; 
    return new TransactionScope(TransactionScopeOption.Required, transactionOptions); 
    } 
} 

心連心

0

我可以告訴你,使用交易依賴於業務規則。

從技術上講,如果您要修改系統上的數據(更新,刪除,插入),您可以僅使用交易。當您剛剛從源獲取值並且100%確定沒有數據被修改/生成時,請不要將此步驟作爲交易的一部分。

爲了簡單起見,使用的交易,如果你回答是肯定的這些情況:

一)在點擊影響多個表。

二)在點擊影響多個系統。這包括位於不同服務器中的數據庫,即使您在同一臺服務器中有兩個不同的實例,它將被視爲不同的系統。 Web服務調用也算作另一個系統。

C)有這樣一個場景:「執行步驟,執行步驟B,如果一切OK,然後返回OK否則恢復步驟b,恢復步驟則返回錯誤」。

現在如何在現實世界中使用交易。那麼,如果您在模型中僅使用一個數據庫,則使用ADO.NET事務模型。 http://adotutorial.blogspot.de/2008/11/transaction-management-in-adonet.html

如果然而,在呼喚數據庫的不同實例在同一臺服務器,或者如果你是混合不同的技術(SQL,甲骨文,Web服務),事務管理將是1000倍更痛苦。那麼你需要使用事務範圍使其更簡單一些。在.NET 2.0中的C#中,您有TransactionScope。這是您可以告訴運行時幫助我們管理事務的方式。

查看本教程,它可能會有所幫助。 http://codingcramp.blogspot.de/2009/06/how-to-setup-and-use-transactionscope.html

如果您使用的是Microsoft技術,並且您正在使用同一臺計算機,那麼您的代碼將運行良好。但是,如果您在聯網環境中運行,或者如果您混合了不同的供應商,則另一個關鍵組件會進入播放中,這稱爲「事務監視器」。如果這是您的情況,那麼您可能需要檢查Microsoft DTC是否在您的環境中啓用,因爲它將是用於協調您的交易的默認選擇。