事務是一組組合成邏輯工作單元的數據庫操作雖然系統中可能會出錯但事務將控制和維護每個數據庫的一致性和完整性如果在事務過程中沒有遇到錯誤事務中的所有修改都將永久成為數據庫的一部分如果遇到錯誤則不會對數據庫作出任何修改
例如在一個銀行應用程序中如果資金從一個帳戶轉到另一個帳戶則會將一定的金額記入一個帳戶的貸方同時將相同的金額記入另一個帳戶的借方由於計算機可能會因為停電網絡中斷等原因而出現故障所以有可能更新了一個表中的行但沒有更新相關表中的行如果數據庫支持事務則可以將數據庫操作組成一個事務以防止因這些事件而使數據庫出現不一致
在 ADONET 中可以使用 Connection 和 Transaction 對象來控制事務若要執行事務請執行下列操作
調用 Connection 對象的 BeginTransaction 方法來標記事務的開始BeginTransaction 返回對 Transaction 的引用請保留此引用以便將其分配給在事務中登記的 Command
將 Transaction 對象分配給要執行的 Command 的 Transaction 屬性如果通過活動的 Transaction 對象對 Connection 執行 Command但該 Transaction 對象尚未分配給 Command 的 Transaction 屬性則將引發異常
執行所需的命令
調用 Transaction 對象的 Commit 方法來完成事務或調用 Rollback 方法來取消事務
以下代碼示例使用 Microsoft? SQL Server? 上的 ADONET 來演示事務邏輯
SqlConnection myConnection = new SqlConnection(Data Source=localhostInitial Catalog=NorthwindIntegrated Security=SSPI)
myConnectionOpen()
// 啟動一個事務
SqlTransaction myTrans = myConnectionBeginTransaction()
// 為事務創建一個命令
SqlCommand myCommand = new SqlCommand()
myCommandConnection=myConnection
myCommandTransaction = myTrans
try
{
myCommandCommandText = Insert into Region (RegionID RegionDescription) VALUES ( Description)
myCommandExecuteNonQuery()
myCommandCommandText = Insert into Region (RegionID RegionDescription) VALUES ( Description)
myCommandExecuteNonQuery()
myTransCommit()
ConsoleWriteLine(Both records are written to database)
}
catch(Exception e)
{
myTransRollback()
ConsoleWriteLine(eToString())
ConsoleWriteLine(Neither record was written to database)
}
finally
{
myConnectionClose()
}
From:http://tw.wingwit.com/Article/program/net/201311/15730.html