VB.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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |