2013-10-16 30 views
1

我有一個使用FirebirdSQL連接到Firebird 2.5數據庫的WinForms應用程序。 在這個應用程序中,我有一個FBConnection,用於與數據庫進行交互,還有一個控件提供了用於編輯數據庫的按鈕,文本框等各種事件處理程序。 當這個控件加載時我通過調用FBConnection實例的BeginTransaction()方法創建一個新的事務。 因此,當用戶與控件(按鈕)相互作用我打電話,像這樣在DB改變值的方法(通過調用存儲過程或執行SQL語句):使用FirebirdSQL(C#)執行多個事務

FbCommand command = new FbCommand(cmd_text, connection); 
command.Transaction = transaction; 
FbDataReader reader = command.ExecuteReader() 

當用戶決定應用,他所做的所有更改到數據庫,他點擊我的控件上的「Apply」按鈕,調用transaction.Commit()或「Cancel」按鈕,調用transaction.Rollback()。

這工作得很好,但突然間我遇到了在我的應用程序中使用多個事務的問題。在一個應用程序中同時使用多個編輯控件的情況下,您似乎無法在一個連接內創建和使用多個事務。

我的問題是 - 我不知道如何使用一個連接創建多個並行事務。我開始相信FirebirdSQL是不可能的。似乎唯一的解決方案是爲每個活動事務創建與DB的新連接,但我並不喜歡這種方式。

如果我在FirebirdSQL中使用事務是錯誤的,或者任何人都知道如何解決我的問題,而不是創建與數據庫的多個連接,我會很感激建議。

+0

簡單地使用每個交易一個連接有什麼問題? – Ralf

+0

其中一個原因是打開和關閉數據庫的連接有時會非常緩慢,也許我錯了,但似乎並不是一個好習慣,爲每次必須執行的小事務不斷創建和關閉連接 –

+0

Firebird本身支持每個連接多個事務,但我不確定Firebird。NET提供者支持這一點。 –

回答

1
  • 不共享連接。爲每個控件創建一個連接。讓連接池優化並管理您的物理連接。
  • 請勿長時間打開連接。如果物理連接將被破壞,您將失去所有的更改。 ADO .NET專爲斷開連接的場景而設計。
  • 請勿使用長時間運行的交易。特別是,不要與Firebird一起使用它們。

考慮以下情形:

  • 打開連接,從數據源,靠近連接負載數據。當您需要更改某些內容時,打開連接,更改內容,然後關閉連接。
  • 打開連接,從數據源加載數據,關閉連接。當您需要更改某些內容時,請在本地進行更改。跟蹤所有更改並提交一次(例如,當用戶按下「保存」按鈕時)。
+0

火鳥長時間運行的交易有什麼問題?我是這個RDBMS的新手。 –

+1

它們可能會影響服務器的性能。 Firebird對於長時間運行的事務(只讀事務)有一些優化(參見'READ ONLY'選項:http://www.firebirdsql.org/refdocs/langrefupd25-set-trans.html)。但是,很明顯,您無法在此交易中更改任何內容。 – Dennis

+0

我無法真正使用您的場景導致存儲過程的原因,我稱之爲執行某些業務邏輯,我無法在本地執行加緩存和數據副本的工作,防止客戶端看到並響應其他數據庫用戶的更改在DB中製作。 –