數據庫事務簡介
數據庫事務是由一組SQL語句組成的一個邏輯工作單元。您可以把事務看作是一組不可分的SQL語句,這些語句作為一個整體永久記錄在數據庫中或一並撤銷。比如在銀行帳戶之間轉移資金:一條UPDATE語句將從一個帳戶的資金總數中減去一部分,另一條UPDATE語句將把資金加到另一個帳戶中。減操作和加操作必須永久記錄在數據庫中,或者必須一並撤銷 — 否則將損失資金。這個簡單的示例僅使用了兩條UPDATE語句,但一個更實際的事務可能包含許多INSERT、UPDATE和DELETE 語句。
要永久記錄一個事務中的SQL語句的結果,您可以通過 COMMIT 語句來執行提交。要撤銷SQL語句的結果,您可以使用ROLLBACK語句來執行回滾,這會把所有的行重設為它們原來的狀態。只要您事先沒有與數據庫斷開,則您在執行回滾之前所做的任何修改都將被撤銷。您還可以設置一個保存點,以便將事務回滾至該特定的點,同時保持事務中的其他語句原封不動。
使用數據庫事務(主要針對VB.net)
您可以使用OracleTransaction類的一個對象來表示一個事務。OracleTransaction類包含多個屬性,其中的兩個為 Connection(指定與事務關聯的數據庫連接)和 IsolationLevel(指定事務隔離級別)
Connection,指定與該事務關聯的OracleConnection對象;
IsolationLevel,指定該事務的IsolationLevel;枚舉類型,用於對事物的鎖定,取值有Chaos、ReadCommited、ReadUncommited、RepeatableRead、Serializable、Unspecified。
應用程序通過針對OracleConnection對象調用 BeginTransaction 來創建OracleTransaction對象。對OracleTransaction對象執行與該事務關聯的所有後續操作(例如提交或中止該事務)。
Commit:提交SQL數據庫事務;
Rollback :從掛起狀態回滾事務;
您還可以使用 Save() 在事務中設置一個保存點。
下面的示例創建一個 OracleConnection 和一個 OracleTransaction。它還演示了如何使用 BeginTransaction、Commit 和 Rollback 方法。(這是MSDN裡的范例)
需要注意的是,這些操作需要引入命名空間: Oracle.DataAcess.Client
Oracle.DataAccess.Client 命名空間是 ODP.NET 的一部分,它包含許多類,其中有 OracleConnection、OracleCommand 和 OracleTransaction。示例程序就用到了這些類。
事務操作
1Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String)
2 Dim myConnection As New OracleConnection(myConnString)
3 myConnection.Open()
4
5 Dim myCommand As OracleCommand = myConnection.CreateCommand()
6 Dim myTrans As OracleTransaction
7
8 ' Start a local transaction
9 myTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted)
10 ' Assign transaction object for a pending local transaction
11 myCommand.Transaction = myTrans
12
13 Try
14 myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (50, 'TECHNOLOGY', 'DENVER')"
15 myCommand.ExecuteNonQuery()
16 myCommand.CommandText = "INSERT INTO Dept (DeptNo, Dname, Loc) values (60, 'ENGINEERING', 'KANSAS CITY')"
17 myCommand.ExecuteNonQuery()
18 myTrans.Commit()
19 Console.WriteLine("Both records are written to database.")
20 Catch e As Exception
21 myTrans.Rollback()
22 Console.WriteLine(e.ToString())
23 Console.WriteLine("Neither record was written to database.")
24 Finally
25 myConnection.Close()
26 End Try
27End Sub
28
在.NET程序中設置事務保存點
正如本文前面所提到的那樣,您可以設置一個保存點,以便將事務回滾至該特定的點,同時保持事務中的其他語句原封不動。您可以使用 OracleTransaction 類的 Save() 方法在事務中設置保存點。
如果您有一個非常長的事務並且希望能夠僅回滾到某個特定的時間點,那麼您可能要使用保存點。例如,您可能想對 10 個產品做一些更改,然後設置一個保存點,然後再對另 10 個產品做更改;如果您在進行第二批更改時出現了錯誤,那麼您可以回滾至保存點,使您的第一批更改原封不動。
使用OracleTransaction對象需要注意的幾點:
1)你需要在你整個事務執行中只能有唯一OracleConnection ,OracleCommand,
OracleTransaction,也就是說如果你事務處理過程中如果需要與數據庫的操作都只能在這唯一的Command中執行,類似於:
imgCommand.CommandText = sSQL
imgCommand.ExecuteNonQuery()或其他操作
若你新建一個連接執行其他數據庫操作的話,整個事務過程就會拋出異常
2)如果你需要在你SQL語句中加入參數,則你必須在你執行完提交或相關數據庫操作之後將其Command的參數清空,下邊舉一個實際的項目裡的事務函數:
事務函數
1 ''' <summary>
2 ''' 保存熱點文本文件信息到數據庫
3 ''' </summary>
4 Private Function SaveTextFile()Function SaveTextFile() As Boolean
5 Dim sSQl As String
6 sSQl = "select type_id from sys_file_type where file_extname='TXT'"
7 Try
8 imgCommand.CommandText = sSQl
9 Dim typeID As Int32 = Convert.ToInt32(imgCommand.ExecuteScalar()) '文件類型
10 '讀取文本信息
11 Dim Textblob() As Byte = GetText()
12
13 sSQl = "insert into t_watch_textcontent(image_id,text_content,type_id) values(:imageid,:textcontent,:typeid)"
14 '增添SQL參數
15 Dim Param As OracleClient.OracleParameter
16 Param = New OracleClient.OracleParameter("imageid", sNewImageID)
17 imgCommand.Parameters.Add(Param)
18 Param = New OracleClient.OracleParameter("textcontent", Textblob)
19 imgCommand.Parameters.Add(Param)
20 Param = New OracleClient.OracleParameter("typeid", typeID)
21 imgCommand.Parameters.Add(Param)
22
23 '提交信息
24 imgCommand.CommandText = sSQl
25 If imgCommand.ExecuteNonQuery() > 0 Then
26 bResult = True
27 '關鍵是這裡,需要你手動清除參數
28 imgCommand.Parameters.Clear()
29 End If
30 Catch ex As Exception
31 Me.ExceptionMessage = ex
32 bResult = False
33 End Try
34
35 Return bResult
36 End Function