如何使用 DB2 資料庫執行交易
交易是結合成一個邏輯工作單元的資料庫作業群組,可用來控制和維護每個資料庫的一致性和完整性,即使系統中可能發生的錯誤。 交易是由一系列 SQL SELECT、INSERT、UPDATE 或 DELETE 子句所組成。 如果在交易期間沒有發生任何錯誤,交易中的所有修改都會成為資料庫的永久部分。 如果發生錯誤,則不會對資料庫進行任何修改。
當交易為單一階段交易,且直接由資料庫處理時,系統便會將該交易視為本機交易。 當交易由交易監視器進行協調,並使用保全機制 (如兩階段認可) 進行交易解析時,系統便會將該交易視為分散式交易。
注意
交易在伺服器上執行時效率最高。 如果您使用SQL Server資料庫來大量使用明確交易,您應該考慮使用 Transact-SQL BEGIN TRANSACTION 語句將它們寫入為預存程式。
您可以使用 物件控制交易 MsDb2Connection
。 您可使用 BeginTransaction
方法來起始本機異動。 一旦您開始交易之後,就可以使用該 Transaction
物件的 屬性 MsDb2Command
在該交易中登記命令。 然後,您可根據異動元件的成敗,來認可或復原對資料來源所做的修改。
交易有三個基本命令:BEGIN、COMMIT 和 ROLLBACK。 BEGIN 語句會標示交易的開頭。 BEGIN 語句之後嘗試的所有程式都會被視為交易的一部分,由 COMMIT 語句完成,或由 ROLLBACK 語句取消。
執行交易
呼叫
MsDb2Connection.BeginTransaction
以標記交易的開頭。BeginTransaction
會傳回交易的參考。 保留此參考,以便您將它指派給在交易中登記的命令。將交易指派給
MsDb2Command.Transaction
要執行的 。如果在具有使用中交易的連接上執行命令,而且
Transaction
物件尚未指派給Transaction
的Command
屬性,MsDb2Exception
則會擲回 。執行必要的命令。
呼叫
MsDb2Transaction.Commit
以完成交易,或呼叫MsDb2Transaction.Rollback
以取消交易。如果在執行
Commit
或Rollback
方法之前關閉或處置連接,則會復原異動。下列程式碼範例示範如何執行交易。
static void TransactionConnection()
{
MsDb2Connection myConnection new MsDb2Connection(@"file name=HOST.udl ");
myConnection.Open();
// Start a local transaction.
MsDb2Transaction myTrans = myConnection.BeginTransaction();
// Enlist the command in the current transaction.
MsDb2Command myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
myCommand.ExecuteNonQuery();
myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Both records are written to database.");
}
catch(Exception e)
{
try
{
myTrans.Rollback();
}
catch (MsDb2Exception ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("An exception of type " + ex.GetType() +
" was encountered while attempting to roll back the transaction.");
}
}
Console.WriteLine("An exception of type " + e.GetType() +
"was encountered while inserting the data.");
Console.WriteLine("Neither record was written to database.");
}
finally
{
Console.ReadLine();
myConnection.Close();
}
}
// End TransactionConnection