我只是想了解一下使用C#語言.NET事務。我在網上瀏覽過不同的文章。然而,我從理論上了解交易,但我想實時瞭解交易的確切用途。例如,我何時應該實時使用交易。假設我正在編寫代碼,我正在對鏈接的點擊事件進行一些操作。比方說,我打SQL連接來獲取一些值。我應該在那裏使用交易嗎?如果我正在編寫簡單的代碼,在不使用sql連接的情況下獲取值,我應該在那裏使用事務嗎?使用交易有什麼優點和缺點?獲得理論知識是不同的,但我想知道它的確切用途。何時何時不使用。交易可以使用簡單的代碼嗎?任何有關交易的基本內容的反應或鏈接都是受歡迎的。
回答
我點擊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
Vasnth,你不應該只是給另一個網站的鏈接作爲答案,因爲該網站可能會在未來過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:meta.stackoverflow.com/q/8259 –
如果你是嚴重的使用事務,你也可以閱讀一些相關文章在.NET中TransactionScope
類。這樣實現事務非常簡單。
http://simpleverse.wordpress.com/2008/08/05/using-transactionscope-for-handling-transactions/
例子:
using (var transaction = new TransactionScope())
{
// My Database Operations. It doesn't matter what database Type
transaction.Complete();
}
交易的本質是確保代表單個進程的一個或多個變化到數據庫一次,如果其中一個出現故障,其他的應被顛倒。如果您將資金從一個銀行賬戶轉移到另一個銀行賬戶,則從一個賬戶中扣除和存入其他賬戶必須完全成功。否則,這筆錢將在運輸途中丟失
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();
}
}
通常你作爲最建議或許應該使用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);
}
}
心連心
我可以告訴你,使用交易依賴於業務規則。
從技術上講,如果您要修改系統上的數據(更新,刪除,插入),您可以僅使用交易。當您剛剛從源獲取值並且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是否在您的環境中啓用,因爲它將是用於協調您的交易的默認選擇。
- 1. 在C#中的交易中的交易#
- 2. 在C#中的交易#
- 3. 在C#中的交易
- 4. 使用.Net進行SalesForce大容量數據交易C#
- 5. 在「dapper-dot-net」中的交易
- 6. 使用交易
- 7. 在csla和手動交易系統中使用交易
- 8. .net操作的交易
- 9. SQLite的交易失敗,.NET
- 10. .Net交易鎖問題
- 11. .Net網絡服務交易
- 12. 交易中使用mysql_real_escape_string
- 13. 使用和交易
- 14. 使用.NET中的CyberSource API取消/退款交易
- 15. 交易範圍c#
- 16. Redis - 在交易中使用Incr值
- 17. 在PHP和MySQL中使用交易
- 18. 在交易中使用多種方法
- 19. 如何在雪花中使用交易?
- 20. 在ActiveRecord中禁用交易
- 21. 在C中的對象交易#
- 22. 臨時表如何在交易前創建,然後在交易中使用
- 23. Yodlee - 信用卡交易 - 交易地點
- 24. 交易在像MySQL交易PHP
- 25. 使用WITH(NOLOCK)和交易
- 26. 使用Hibernate進行交易
- 27. 使用PDO的交易
- 28. 使用ODataControllers的交易
- 29. DAO的交易使用
- 30. 交易使用deuce stm
Plesae將示例代碼與您的解釋一起發佈。這將有助於瞭解更多。謝謝 –