加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB.NET中的事务处理

发布时间:2020-12-17 00:24:15 所属栏目:大数据 来源:网络整理
导读:事务处理 事务处理(transaction)是一种将相关数据库操作组的方法,这样,如果其中一个操作失败了,整组的事务处理就会全部失败。同样,如果它们操作都成功了,将永久性改变数据源。因此,事务处理是一个安全网,确保数据保持同步。 手动事务处理 ADO.Net中

事务处理

事务处理(transaction)是一种将相关数据库操作组的方法,这样,如果其中一个操作失败了,整组的事务处理就会全部失败。同样,如果它们操作都成功了,将永久性改变数据源。因此,事务处理是一个安全网,确保数据保持同步。

手动事务处理

ADO.Net中的.NET数据提供程序支持通过连接类(connection class)中的方法进行手动事务处理。在手动事务处理过程中,当试图执行一个处理方法前最好先检查一下连接的状态。

开始一个手动事务处理

若想开始一个事务处理则需要调用连接类的BeginTransaction方法。在执行参与事务处理的数据库操作之前,必须调用该方法。执行该调用的最简形式入下:

以默认值开始事务处理

traUserMan=cnnUserMan.BeginTransaction()

连接对象(cnnUserMan)必须有效且已经打开。现在,traUserMan保存着BeginTransaction方法所创建事务处理对象的一个引用。BeginTransaction 是可重载的。

具体参考http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.begintransaction(v=VS.80).aspx

BeginTransaction方法的不同形式都会返回一个继承自SqlTransaction或OleDbTransaction类的事务处理实例。隶属于System.Data命名空间的IsolationLevel的枚举值指定了局部事务处理锁定连接的行为。如果事务处理中改变了隔离等级,那么服务器将对所有剩余语句应用新的隔离等级。

IsolationLevel的枚举请参考:http://msdn.microsoft.com/zh-cn/library/system.data.isolationlevel(v=VS.80).aspx

以非默认隔离等级开始事务处理

Dim cnnUserMan as SqlConnection
Dim traUserMan as SqlTrasaction

'打开连接等
'……此处省略
'按指定隔离等级开始事务处理
traUserMan=cnnUserMan.BeginTransaction(IsolationLevel.ReadComitted)

开始一个命名了的Sql事务处理

Dim cnnUserMan as SqlConnection
Dim traUserMan As SqlTransaction
Const STR_MAIN_TRANSACTION_NAME As String="MainTransaction"


'打开连接等
'……此处省略
 
'开始一个命名了的事务处理
traUserMan=cnnUserMan.BeginTransaction(STR_MAIN_TRANSACTION_NAME)


 
 
 
 
 
 
 

以非默认隔离等级开始一个命名了的SQL事务处理

Dim cnnUserMan as SqlConnection
Dim traUserMan As SqlTransaction
Const STR_MAIN_TRANSACTION_NAME As String="MainTransaction"
'打开连接等
'……此处省略
'开始一个命名了的事务处理traUserMan=cnnUserMan.BeginTransaction(IsolationLevel.ReadComitted,STR_MAIN_TRANSACTION_NAME)







事务处理嵌套以及SqlTransaction中事务处理保存点的使用

该主题只对SqlTransaction和SqlTransaction类有效。如果你在进行嵌套事务处理,那么最好给每个事务处理指定一个容易辨认的名称,以便能够更容易的分辨出这些事务处理。ADO.NET中,在一个连接中不能有多个事务处理。在ADO中,对于一个连接而言,可以通过多次调用BeginTransaction方法为每个事务处理指定名称开始多个事务处理。ADO.NET也以BEginTransaction方法开始。BeginTransaction方法所返回的事务处理对象具有Save方法,可以达到与ADO同样的目的。甚至,ADO.NET使得嵌套变得更容易了。

SqlTransaction类的Save方法用于存储事务处理中的参考点。

Dim cnnUserMan As SqlConnection
Dim traUserMan As SqlTransaction
Dim cmmUserMan As SqlCommand
 
Const STR_MAIN_TRANSACTION_NAME AsString="MainTransaction"
Const STR_FAMILY_TRANSACTION_NAME AsString="FamilyUpdates"
Const STR_ ADDRESS_TRANSACTION_NAME AsString="AddressUpdates"
 
'打开连接等
'……此处省略
'开始命名了的事务处理
traUserMan=cnnUserMan.BeginTransaction(STR_MAIN_TRANSACTION_NAME )
'更新系列表
'……此处省略
'存储事务处理参考点
traUserMan.Save(STR_FAMILY_TRANSACTION_NAME)
'更新地址表
'……此处省略
'存储事务处理参考点
traUserMan.Save(ADDRESS_TRANSACTION_NAME )
'返回地址表更新
traUserMan.Rollback(STR_FAMILY_TRANSACTION_NAME)

如上例中,事物可以回到它的任何参考点。

OleDbTransaction中的事务处理嵌套

该主题仅对OleDbConnection和OleDbTransaction类有效。不像ADO中那样,可以通过多次调用BeginTransaction方法在一个连接上开始多个事务处理。在ADO.NET中,只能有一个事务处理,且事物处理也用BeginTransaction方法开始。然而,BeginTransaction方法返回的事务处理对象具有Begin方法,可以用来实现嵌套。以下给出一个OleDbTransaction类Begin方法的示例:

Dim cnnUserMan As OleDbConnection
Dim traUserManMain As OleDbTransaction
Dim traUserManFamily As OleDbTransaction
Dim traUserManAddress As OleDbTransaction
 
'打开连接等
‘……此处省略
'开始主要事务处理
traUserManMain=cnnUserMan.BeginTransaction()
'更新系列表
'……此处省略
'开始嵌套的事务处理
traUserManFamily=traUserManMain.Begin()
'更新地址表
'……此处省略
'开始嵌套的事务处理
traUserManAddress=traUserManFamily.Begin()
'返回地址表更新
traUserManAddress.Rollback()

中止手动事务处理

如果由于某种原因需中止事务处理,那么就需要调用事务处理类的Rollback方法。这可以保证数据源没有发生任何变化。

traUserMan.Rollback()

你可以使用Rollback方法的重载形式来指定事务处理名称。

提交手动事务处理

完成对数据的操作后,就应该调用事务处理类的Commit方法来向数据源提交这些改变进行操作。通过调用BeginTransaction方法开始事务处理以来,对数据所作的全部改变都将被应用到数据源。事实上,这仅对于OleDbTransaction类是完全适用的。如果你使用的是SqlTransaction类,则可以保存多个参考点,并可以通过Rollback方法返回它们中的一个或更多个。在这种情况下,那些被返回的操作显然不会被提交。

检定运行中的事务处理的隔离等级

如果无法确定一个运行中的事务处理的隔离等级,可以用事务处理类的IsolationLevel属性来检定该值,如下:

      Msgbox(traUserMan.IsolationLevel.ToString)
       ’'或者
        intIsolationLevel=traUserMan.IsolationLevel

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读