数据库事务简介
数据库事务是由一组 SQL 语句组成的一个逻辑工作单元您可以把事务看作是一组不可分的 SQL 语句这些语句作为一个整体永久记录在数据库中或一并撤销比如在银行帐户之间转移资金一条 UPDATE语句将从一个帐户的资金总数中减去一部分另一条 UPDATE语句将把资金加到另一个帐户中减操作和加操作必须永久记录在数据库中或者必须一并撤销 — 否则将损失资金这个简单的示例仅使用了两条 UPDATE 语句但一个更实际的事务可能包含许多 INSERTUPDATE和 DELETE 语句
要永久记录一个事务中的 SQL 语句的结果您可以通过 COMMIT 语句来执行提交要撤销 SQL 语句的结果您可以使用 ROLLBACK 语句来执行回滚这会把所有的行重设为它们原来的状态只要您事先没有与数据库断开则您在执行回滚之前所做的任何修改都将被撤销您还可以设置一个保存点以便将事务回滚至该特定的点同时保持事务中的其他语句原封不动
使用数据库事务(主要针对)
您可以使用 OracleTransaction 类的一个对象来表示一个事务OracleTransaction 类包含多个属性其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别)
Connection指定与该事务关联的OracleConnection对象
IsolationLevel指定该事务的IsolationLevel枚举类型用于对事物的锁定取值有ChaosReadCommitedReadUncommitedRepeatableReadSerializableUnspecified
应用程序通过针对OracleConnection对象调用 BeginTransaction 来创建OracleTransaction对象对OracleTransaction对象执行与该事务关联的所有后续操作(例如提交或中止该事务)
Commit:提交SQL数据库事务
Rollback :从挂起状态回滚事务
您还可以使用 Save() 在事务中设置一个保存点
下面的示例创建一个 OracleConnection 和一个 OracleTransaction它还演示了如何使用 BeginTransactionCommit 和 Rollback 方法(这是MSDN里的范例)
需要注意的是这些操作需要引入命名空间: OracleDataAcessClient
OracleDataAccessClient 命名空间是 ODPNET 的一部分它包含许多类其中有 OracleConnectionOracleCommand 和 OracleTransaction示例程序就用到了这些类
事务操作
Public Sub RunOracleTransaction()Sub RunOracleTransaction(myConnString As String)
Dim myConnection As New OracleConnection(myConnString)
myConnectionOpen()
Dim myCommand As OracleCommand = myConnectionCreateCommand()
Dim myTrans As OracleTransaction
Start a local transaction
myTrans = myConnectionBeginTransaction(IsolationLevelReadCommitted)
Assign transaction object for a pending local transaction
myCommandTransaction = myTrans
Try
myCommandCommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( TECHNOLOGY DENVER)
myCommandExecuteNonQuery()
myCommandCommandText = INSERT INTO Dept (DeptNo Dname Loc) values ( ENGINEERING KANSAS CITY)
myCommandExecuteNonQuery()
myTransCommit()
ConsoleWriteLine(Both records are written to database)
Catch e As Exception
myTransRollback()
ConsoleWriteLine(eToString())
ConsoleWriteLine(Neither record was written to database)
Finally
myConnectionClose()
End Try
End Sub
在 NET 程序中设置事务保存点
正如本文前面所提到的那样您可以设置一个保存点以便将事务回滚至该特定的点同时保持事务中的其他语句原封不动您可以使用 OracleTransaction 类的 Save() 方法在事务中设置保存点
如果您有一个非常长的事务并且希望能够仅回滚到某个特定的时间点那么您可能要使用保存点例如您可能想对 个产品做一些更改然后设置一个保存点然后再对另 个产品做更改如果您在进行第二批更改时出现了错误那么您可以回滚至保存点使您的第一批更改原封不动
使用OracleTransaction对象需要注意的几点
)你需要在你整个事务执行中只能有唯一OracleConnection OracleCommand
OracleTransaction也就是说如果你事务处理过程中如果需要与数据库的操作都只能在这唯一的Command中执行类似于:
imgCommand
CommandText = sSQL
imgCommandExecuteNonQuery()或其他操作
若你新建一个连接执行其他数据库操作的话整个事务过程就会抛出异常
)如果你需要在你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
imgCommandCommandText = sSQl
Dim typeID As Int = ConvertToInt(imgCommandExecuteScalar()) 文件类型
读取文本信息
Dim Textblob() As Byte = GetText()
sSQl = insert into t_watch_textcontent(image_idtext_contenttype_id) values(:imageid:textcontent:typeid)
增添SQL参数
Dim Param As OracleClientOracleParameter
Param = New OracleClientOracleParameter(imageid sNewImageID)
imgCommandParametersAdd(Param)
Param = New OracleClientOracleParameter(textcontent Textblob)
imgCommandParametersAdd(Param)
Param = New OracleClientOracleParameter(typeid typeID)
imgCommandParametersAdd(Param)
提交信息
imgCommandCommandText = sSQl
If imgCommandExecuteNonQuery() > Then
bResult = True
关键是这里需要你手动清除参数
imgCommandParametersClear()
End If
Catch ex As Exception
MeExceptionMessage = ex
bResult = False
End Try
Return bResult
End Function