c#事务的使用、示例及注意事项.doc_第1页
c#事务的使用、示例及注意事项.doc_第2页
c#事务的使用、示例及注意事项.doc_第3页
c#事务的使用、示例及注意事项.doc_第4页
c#事务的使用、示例及注意事项.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、事务的介绍.NET Framework 开发员指南事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。在 ADO.NET 中,可以使用 Connection 和 Transaction 对象来控制事务。可以使用 Connection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 Command 对象的 Transaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 Transaction 对象提交或回滚在数据源中所做的修改。还可以使用 Connection.EnlistDistributedTransaction 在现有的分布式事务中登记。在现有的分布式事务中登记可以确保当提交或回滚整个分布式事务时,也提交或回滚对数据源所作的代码修改。以下示例创建一个 OleDbConnection 和一个 OleDbTransaction。它还演示了如何使用 BeginTransaction、Commit 和 Rollback 方法。public void RunOleDbTransaction(string myConnString)OleDbConnection myConnection = new OleDbConnection(myConnString);myConnection.Open();OleDbCommand myCommand = myConnection.CreateCommand();OleDbTransaction myTrans;/ Start a local transactionmyTrans = myConnection.BeginTransaction(IsolationLevel.ReadCommitted);/ Assign transaction object for a pending local transactionmyCommand.Connection = myConnection;myCommand.Transaction = myTrans;trymyCommand.CommandText = Insert into Region (RegionID, RegionDescription) VALUES (100, Description);myCommand.ExecuteNonQuery();myCommand.CommandText = Insert into Region (RegionID, RegionDescription) VALUES (101, Description);myCommand.ExecuteNonQuery();myTrans.Commit();Console.WriteLine(Both records are written to database.);catch(Exception e)trymyTrans.Rollback();catch (OleDbException ex)if (myTrans.Connection != null)Console.WriteLine(An exception of type + ex.GetType() + was encountered while attempting to roll back the transaction.);Console.WriteLine(An exception of type + e.GetType() + was encountered while inserting the data.);Console.WriteLine(Neither record was written to database.);finallymyConnection.Close();OleDbTransaction.Commit 方法提交数据库事务。public virtual void Commit();OleDbTransaction.Rollback 方法从挂起状态回滚事务。public virtual void Rollback();OleDbConnection.BeginTransaction 方法开始数据库事务。public OleDbTransaction BeginTransaction();以当前的 IsolationLevel 值开始数据库事务。public OleDbTransaction BeginTransaction(IsolationLevel);IsolationLevel 枚举?指定连接的事务锁定行为。 在执行事务时,.NET Framework 数据提供程序使用 IsolationLevel 值。在显式更改之前,IsolationLevel 保持有效,但是可以随时对它进行更改。新值在执行时使用,而不是在分析时使用。如果在事务期间更改,服务器的预期行为是,对其余所有语句应用新的锁定级别。IsolationLevel成员 ReadCommitted在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。OleDbConnection.CreateCommand 方法创建和返回一个与 OleDbConnection 相关联的 OleDbCommand 对象。public OleDbCommand CreateCommand();OleDbCommand.Connection 属性获取或设置 OleDbCommand 的此实例使用的 OleDbConnection。public OleDbConnection Connection get; set;如何在.NET中实现事务(1)如何在.NET中实现事务机制呢? 通常可以使用2种方式: 直接写入到sql 中;使用ADO.NET 实现。下面依次作一下介绍:方法1:直接写入到sql 中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现:例如BEGIN TRANSDECLARE orderDetailsError int, productError intDELETE FROM Order Details WHERE ProductID=42SELECT orderDetailsError = ERRORDELETE FROM Products WHERE ProductID=42SELECT productError = ERRORIF orderDetailsError = 0 AND productError = 0COMMIT TRANSELSEROLLBACK TRANS这种方法比较简单,具体可以查阅相关sql server 帮助方法2 :使用ADO.NET 实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。SqlConnection 和OleDbConnection 对象有一个 BeginTransaction 方法,它可以返回 SqlTransaction 或者OleDbTransaction 对象。而且这个对象有 Commit 和 Rollback 方法来管理事务,具体例子如下:cnNorthwind.Open()Dim trans As SqlTransaction = cnNorthwind.BeginTransaction()Dim cmDel As New SqlCommand()cmDel.Connection = cnNorthwindcmDel.Transaction = transTrycmDel.CommandText = _DELETE Order Details WHERE ProductID = 42cmDel.ExecuteNonQuery()cmDel.CommandText = DELETE Products WHERE ProductID = 42cmDel.ExecuteNonQuery()trans.Commit()Catch Xcp As Exceptiontrans.Rollback()FinallycnNorthwind.Close()End TryOk,通过上面的例子可以实现与方法1同样的效果。并发问题:如果没有锁定且多个用户同时访问一个数据库,则当他们的事务同时使用相同的数据时可能会发生问题。并发问题包括:丢失或覆盖更新,未确认的相关性(脏读),不一致的分析(非重复读),幻像读。但是如何来避免数据读取时脏读等问题出现呢?二、事务实例using(SqlTransaction trans = conn.BeginTransaction()try/循环进行信息的插入for(int count = 0; count applyInfo.Length; count +)/声明参数并赋值SqlParameter parms =Database.MakeInParam(Stu_ID,System.Data.SqlDbType.VarChar,11,applyInfocount.StuID),Database.MakeInParamBank_Name,System.Data.SqlDbType.VarChar,50,applyInfocount.BankName), Database.MakeInParamApply_Loan_Money,System.Data.SqlDbType.Money,8,applyInfocount.ApplyLoanMoney), Database.MakeInParam(Apply_Loan_Year,System.Data.SqlDbType.VarChar,20,applyInfocount.ApplyLoanYear), Database.MakeInParamApply_Year,System.Data.SqlDbType.Char,6,applyInfocount.ApplyYear), Database.MakeInParam(Apply_Length,System.Data.SqlDbType.Int,4,applyInfocount.ApplyLength), Database.MakeInParam(Apply_Pass,System.Data.SqlDbType.Char,1,applyInfocount.ApplyPass),Database.MakeInParam(Apply_Remark,System.Data.SqlDbType.VarChar,100,applyInfocount.Apply

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论