`
sptgreen
  • 浏览: 44448 次
  • 性别: Icon_minigender_1
  • 来自: 荆门
社区版块
存档分类
最新评论

.net 事务处理的实现方法

    博客分类:
  • .NET
阅读更多
事务类型:

   1,手动事务:用开始和结束事务的显式指令(BEGIN TRANSACTION 和 END TRANSACTION )控制事务边界。从一个事务边界内可以开始第二个被称为嵌套事务的事务。直到所有从属事务提交,其父事务才提交。

   2:自动事务:基于每个组件的声明特性集管理事务边界。事务自动流向被指示参与事务的对象,并跳过被指示在事务外部执行的对象。使用自动事务模型时无法嵌套事务。

分布式事务处理 (TP):分布式事务处理 (TP) 系统旨在协助在分布式环境中跨异类的事务识别资源的事务。

手动事务和 ADO.NET
SQL 客户端和 OLE DB .NET 提供程序在公共语言运行库中支持手动事务。在 ADO.NET 中,这两个 .NET 提供程序都可以用来控制事务。

应使用 ADO.NET 连接对象 Connection.BeginTransaction 开始本地事务。用 Command 对象的 Transaction 属性登记该事务中的命令。使用 Transaction 对象根据事务组件的成功或失败而提交或回滚在数据源做的修改。

登记在默认情况下是自动的,而且可以禁用。如果禁用了自动登记,您可以手动登记。在一个现有分布式事务中使用 Connection.EnlistDistributedTransaction 进行登记。

若要执行事务,请执行下列操作:

调用 Connection 对象的 BeginTransaction 方法来标记事务的开始。BeginTransaction 方法返回对 Transaction 的引用。该引用将分配给登记在事务中的 Command 对象。
将 Transaction 对象分配给要执行的 Command 的 Transaction 属性。如果通过活动的 Transaction 对象对 Connection 执行 Command,但该 Transaction 对象尚未分配给 Command 的 Transaction 属性,则将引发异常。
执行所需的命令。
调用 Transaction 对象的 Commit 方法来完成事务,或调用 Rollback 方法来取消事务。
myConnection.Open();

SqlTransaction myTrans = myConnection.BeginTransaction();

SqlCommand myCommand = myConnection.CreateCommand();
myCommand.Transaction = myTrans;

try
{
  myCommand.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)
{
  try
  {
    myTrans.Rollback();
  }
  catch (SqlException ex)
  {
    if (myTrans.Connection != null)
    {
      Console.WriteLine("An exception of type " + ex.GetType() +
                        " was encountered while attempting to roll back the transaction.");
    }
  }


分布事务:

如果 Connection 对象确定事务是活动的,它将自动登记在现有的分布式事务中。当打开连接或从连接池中检索连接时,将发生自动事务登记。这种情况,如果在Connection打开后,如果想再将新的的操作(command)登记入事务使不可能的。此时,应禁用自动登记功能:

   sqlserver为在连接字符串中设置Enlist字段为false:Enlist=false

   oledb中为OLE DB Services=-7

此时可以使用 EnlistDistributedTransaction 在事务中登记 Connection

SqlConnection nwindConn = new SqlConnection(".......;Enlist=false;");

SqlCommand cmd = new SqlCommand("......", nwindConn);


...

nwindConn.Open();

ITransaction trans =(ITransaction)ContextUtil.Transaction;//获取当前分布事务

nwindConn.EnlistDistributedTransaction(trans);//之前必须nwindConn.Open();

try
    {
      cmd.ExecuteNonQuery();//执行事务

      ContextUtil.SetComplete();//提交事务
    }
    catch (SqlException e)
    {
     ContextUtil.SetAbort();
    }
    finally
    {
      nwindConn.Close();
    }


例子:
/// <summary>
/// SQL Server事务样本类,演示Sql的事务操作
/// 作者:李斌(Camus)
/// </summary>
public class SQLServerTransactionDemo
{
private SQLServerTransactionDemo(){}

/// <summary>
/// 获取SQL Server事务样本类的实例方法
/// </summary>
/// <returns>SQL Server事务样本类的实例</returns>
public static SQLServerTransactionDemo GetHandle()
{
return new SQLServerTransactionDemo();
}

#region 运行SQL Server事务Run方法
/// <summary>
/// 运行SQL Server事务
/// </summary>
public void Run()
{
// 访问Microsoft SQL Server样本数据库Northwind,假设Microsoft SQL Server的sa密码为空
string connectionString=@"Server=(Local);Database=Northwind;UID=sa;PWD=;Persist Security Info=false;";

//创建Connection对象
System.Data.SqlClient.SqlConnection sqlConnection = null;
System.Data.SqlClient.SqlTransaction sqlTransaction = null;
try
{
sqlConnection = new System.Data.SqlClient.SqlConnection(connectionString);
sqlConnection.Open();//打开Connection

// 开始本地事务,Connection.BeginTransaction()
// IsolationLevel.ReadCommitted:
// 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。
sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted,"SQLTransaction");

//创建Command对象
System.Data.SqlClient.SqlCommand sqlCommand = sqlConnection.CreateCommand();
// 指派Connection和Transaction对象给Command对象
sqlCommand.Connection = sqlConnection;
sqlCommand.Transaction = sqlTransaction;

//开始执行事务,该事务由命令1 2 3组成.
// 执行数据库命令1
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (200, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 执行数据库命令2
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (201, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 执行数据库命令3!!!与命令1相同,会出错
sqlCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (200, \'Description\')";
sqlCommand.ExecuteNonQuery();
// 提交事务
sqlTransaction.Commit();
Console.WriteLine("两条数据库命令已经执行完成.");
}
catch(Exception e)
{
try
{
if(sqlTransaction != null)
{
// 回滚事务
sqlTransaction.Rollback("SQLTransaction");
}
}
catch (System.Data.SqlClient.SqlException ex)
{
// 回滚事务失败
if (sqlTransaction.Connection != null)
{
Console.WriteLine("执行回滚事务时出现 " + ex.GetType() + " 违例!" + ex.Message);
}
}
   
Console.WriteLine("在执行数据库命令时出现 " + e.GetType() + " 违例!" + e.Message);
Console.WriteLine("两条数据库命令均未完成.");
}
finally 
{
//关闭Connection
if(sqlConnection != null)
{
sqlConnection.Close();
}
}
}
#endregion

public static void Main(string[] args)
{
SQLServerTransactionDemo.GetHandle().Run();
}
}



分享到:
评论

相关推荐

    Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。 这个也是网上说的面向切面编程AOP。 AOP的概念也很...

    asp.net 中事务处理案例

    session+sqltransaction实现简单事务,实现批量数据整体上传

    利用C#+ASP.Net 2.0技术实现对SQL2005的数据快速拷贝处理程序例子代码

    利用C#+ASP.Net 2.0技术实现对SQL2005的数据快速拷贝处理程序例子代码。

    ADO.net通用类库实现与实例

    ADO.net数据库操作通用类的实现。包括增删查改,三种事务处理方式,数据库的备份与恢复。并含有数据库文件。

    .NET Remoting实现分布式数据库查询

    远程处理是.NET框架提供的一项强大的技术,利用它可以使位于任何位置的应用程序互相通信,这些应用程序可能在同一台计算机上运行,也可能位于同一局域网中的不同计算机上,或者位于相隔万里的有巨大差异的网络中。...

    asp.net知识库

    使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法 制作一个简单的多页Tab功能 一完美的关于请求的目录不存在而需要url重写的解决方案! 在C#中实现MSN消息框的功能 XmlHttp实现无刷新三联动ListBox 鼠标...

    asp.net开发常用整理集合

    不断更新中  Asp.net页面内传参数方法  调用存储过程(两种方法比较)  调用存储过程通用类DBHelper  加密解密 ... MySQL事务处理  SQL内部常用函数  为gridview“删除”列添加确认对话框

    用asp.net和winform分别实现银行存取钱

    用三层架构实现的一个小型银行存取钱系统,所以用了winform 和asp.net实现表示层。在存钱和取钱时用事务实现数据的一致性

    ADO.NET本质论.pdf

    3.11.3 声明性事务处理的工作原理 3.12 permission类 3.13 小结 第4章 dataset类:关系数据的集合 4.1 dataset 4.1.1 dataset作为驻留内存的数据库 4.1.2 dataset的用途 4.2 dataset对象模型 ...

    ASP.NET基础控件-教程

    内容:  Asp.net页面内传参数方法  调用存储过程(两种方法比较)  调用存储过程通用类DBHelper  加密解密  SQL常用DBHelper  Asp.net存储过程无限分类  TreeView无限分类 ... MySQL事务处理  SQL内部常用函数

    亮剑.NET深入体验与实战精要2

    5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见...

    COM+事务处理

    要实现COM+事务处理的类则必须继承System.EnterpriseServices.ServicedComponent,这些类需要是公共的,并且需要提供一个公共的默认的构造器。其实Web Service就是继承ServicedComponent,所以Web Service也支持COM+...

    ado[1].net中文手册 学习 ado.net的重要资料

    .NET 数据提供程序实现入门:为定义 .NET 数据提供程序提供信息和建议,其中包括有关可用于实现的接口的说明和有关为提供程序创建命名空间的信息。 实现连接:描述连接的特性,并说明如何为 .NET 数据提供程序实现您...

    用vb.net实现的影院售票系统的源代码

    以提高影院服务质量,以经济管理为主导,支持影院事务处理,事务质量的监督与控制,支持影院经济核算,将以信息手工处理为主的模式转变为实现整个业务流程计算机网络化的新型管理模式;给用户建设一套方便的影院售票...

    亮剑.NET深入体验与实战精要3

    5.4.5 System.Transactions 事务处理 236 5.5 Oracle开发常见问题 240 5.5.1 Oracle和SQL Server的常用函数对比 240 5.5.2 Oracle和SQL Server的语句区别 244 5.5.3 ASP.NET连接Oracle失败的解决方法 245 本章常见...

    史上最好传智播客就业班.net培训教程60G 不下会后悔

    数据库开发基础、Microsoft SQLServer基础、SQL语言基础、索引、事务、SQL语言高级技术(空值处理、聚合与分组、数据分页、Union、日期函数、类型转换函数、流控函数、表连接、子查询、存储过程、触发器)、数据库...

    ASP.NET标准教程(PDF)

    Microsoft ASP.NET主要针对四类开发综合性事务的处理,包括:计算、即时通信、数据库、XML等应用程序。掌握上述四类应用程序,将可以帮助初学者对Microsoft ASP.NET有更加深入的了解。利用开发程序有序地处理日常...

    ASP.NET的网页代码模型及生命周期

    代码分离有一种好处,就是在.aspx页面中,开发人员可以将页面直接作为样式来设计,即美工人员也可以设计.aspx页面,而.cs文件由程序员来完成事务处理。同时,将ASP.NET中的页面样式代码和逻辑处理代码分离能够让维护...

    asp.net技术内幕(1)

    1.2.1 简单的ASP.NET页面 1.2.2 ASP.NET控件的优点 1.2.3 ASP.NET控件概述 1.3 向ASP.NET页面中添加应用逻辑 1.3.1 处理控件事件 1.3.2 处理页面事件 1.4 ASP.NET页面的结构 1.4.1 ...

    .NET可逆框架设计

    前段时间一直在学习和研究.NET事务处理,慢慢的我发现可以使用事务处理来实现一种可逆的系统框架。这种框架在一些IT社区似乎还没有见过,但是在我们日常开发中确实有这个需求。所以我花了点时间深入的研究了一下事务...

Global site tag (gtag.js) - Google Analytics