數據庫事務簡介
數據庫事務是由一組 SQL 語句組成的一個邏輯工作單元
您可以把事務看作是一組不可分的 SQL 語句
這些語句作為一個整體永久記錄在數據庫中或一並撤銷
比如在銀行帳戶之間轉移資金
一條 UPDATE語句將從一個帳戶的資金總數中減去一部分
另一條 UPDATE語句將把資金加到另一個帳戶中
減操作和加操作必須永久記錄在數據庫中
或者必須一並撤銷 — 否則將損失資金
這個簡單的示例僅使用了兩條 UPDATE 語句
但一個更實際的事務可能包含許多 INSERT
UPDATE和 DELETE 語句
要永久記錄一個事務中的 SQL 語句的結果
您可以通過 COMMIT 語句來執行提交
要撤銷 SQL 語句的結果
您可以使用 ROLLBACK 語句來執行回滾
這會把所有的行重設為它們原來的狀態
只要您事先沒有與數據庫斷開
則您在執行回滾之前所做的任何修改都將被撤銷
您還可以設置一個保存點
以便將事務回滾至該特定的點
同時保持事務中的其他語句原封不動
使用數據庫事務(主要針對)
您可以使用 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
示例程序就用到了這些類
事務操作
Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String)
Dim myConnection As New OracleConnection(myConnString)
myConnection
Open()
Dim myCommand As OracleCommand = myConnection
CreateCommand()
Dim myTrans As OracleTransaction
Start a local transaction
myTrans = myConnection
BeginTransaction(IsolationLevel
ReadCommitted)
Assign transaction object for a pending local transaction
myCommand
Transaction = myTrans
Try
myCommand
CommandText =
INSERT INTO Dept (DeptNo
Dname
Loc) values (
TECHNOLOGY
DENVER
)
myCommand
ExecuteNonQuery()
myCommand
CommandText =
INSERT INTO Dept (DeptNo
Dname
Loc) values (
ENGINEERING
KANSAS CITY
)
myCommand
ExecuteNonQuery()
myTrans
Commit()
Console
WriteLine(
Both records are written to database
)
Catch e As Exception
myTrans
Rollback()
Console
WriteLine(e
ToString())
Console
WriteLine(
Neither record was written to database
)
Finally
myConnection
Close()
End Try
End Sub
在 NET 程序中設置事務保存點
正如本文前面所提到的那樣您可以設置一個保存點以便將事務回滾至該特定的點同時保持事務中的其他語句原封不動您可以使用 OracleTransaction 類的 Save() 方法在事務中設置保存點
如果您有一個非常長的事務並且希望能夠僅回滾到某個特定的時間點那麼您可能要使用保存點例如您可能想對 個產品做一些更改然後設置一個保存點然後再對另 個產品做更改如果您在進行第二批更改時出現了錯誤那麼您可以回滾至保存點使您的第一批更改原封不動
使用OracleTransaction對象需要注意的幾點
)你需要在你整個事務執行中只能有唯一OracleConnection OracleCommand
OracleTransaction也就是說如果你事務處理過程中如果需要與數據庫的操作都只能在這唯一的Command中執行類似於:
imgCommand
CommandText = sSQL
imgCommand
ExecuteNonQuery()或其他操作
若你新建一個連接執行其他數據庫操作的話
整個事務過程就會拋出異常
)如果你需要在你SQL語句中加入參數
則你必須在你執行完提交或相關數據庫操作之後將其Command的參數清空
下邊舉一個實際的項目裡的事務函數
事務函數
<summary>
保存熱點文本文件信息到數據庫
</summary>
Private Function SaveTextFile()Function SaveTextFile() As Boolean
Dim sSQl As String
sSQl =
select type_id from sys_file_type where file_extname=
TXT
Try
imgCommand
CommandText = sSQl
Dim typeID As Int
= Convert
ToInt
(imgCommand
ExecuteScalar())
文件類型
讀取文本信息
Dim Textblob() As Byte = GetText()
sSQl =
insert into t_watch_textcontent(image_id
text_content
type_id) values(:imageid
:textcontent
:typeid)
增添SQL參數
Dim Param As OracleClient
OracleParameter
Param = New OracleClient
OracleParameter(
imageid
sNewImageID)
imgCommand
Parameters
Add(Param)
Param = New OracleClient
OracleParameter(
textcontent
Textblob)
imgCommand
Parameters
Add(Param)
Param = New OracleClient
OracleParameter(
typeid
typeID)
imgCommand
Parameters
Add(Param)
提交信息
imgCommand
CommandText = sSQl
If imgCommand
ExecuteNonQuery() >
Then
bResult = True
關鍵是這裡
需要你手動清除參數
imgCommand
Parameters
Clear()
End If
Catch ex As Exception
Me
ExceptionMessage = ex
bResult = False
End Try
Return bResult
End Function
From:http://tw.wingwit.com/Article/program/net/201311/12778.html