ADO.NET+ASP.NET+SQL--事务

ADO.NET 事务:

/// <summary>

/// 执行多条SQL语句,实现数据库事务。

/// </summary>

/// <param name="SQLStringList">多条SQL语句</param>

public static void ExecuteSqlTran(ArrayList SQLStringList)

{

using (SqlConnection conn = new SqlConnection(connectionString))

{

conn.Open();

SqlCommand cmd = new SqlCommand();

cmd.Connection=conn;

SqlTransaction tx=conn.BeginTransaction();

cmd.Transaction=tx;

try

for(int n=0;n<SQLStringList.Count;n++)

{

string strsql=SQLStringList[n].ToString();

if (strsql.Trim().Length>1)

{

cmd.CommandText=strsql;

cmd.ExecuteNonQuery();

}

}

tx.Commit();

}

catch(System.Data.SqlClient.SqlException E)

{

tx.Rollback();

throw new Exception(E.Message);

}

}

}

---------------------------------------------------

                    分割线

---------------------------------------------------

ASP.NET 事物:

public static void ExecuteTransaction()

{

  TransactionOptions transactionOption= new TransactionOptions();

  transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;

  using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOption))

  {

  //DO YOUR METHODS here

  transactionScope.Complete();

  }

}

可以有返回值,改一下:

public static bool ExecuteTransaction()

{

  bool hasTranscationCommitted = false;

  TransactionOptions transactionOption= new TransactionOptions();

  transactionOption.IsolationLevel= System.Transactions.IsolationLevel.ReadCommitted;

  try

  {

  using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required,transactionOption))

  {

  //DO YOUR METHODS here

  transactionScope.Complete();

  hasTranscationCommitted = true;

  }

  }

  catch //or catch TransactionAbortedException and return error string

  {

  hasTranscationCommitted = false;

  }

  return hasTranscationCommitted;

}

1.如果是分布式transaction,transaction不能正常运行话需要配置服务器DTC(Distributed Transaction Coordinator。如何配置你查一下相关文档

2.在本机运行的话可能没有问题。但如果clint,server不是同一电脑,Transaction不能正常运行的话,

需要在服务器管理工具-> Component ->My Computers ->My Computer ->属性-> MSDTC ->安全设置 里面允许网络访问;Allow inBound and outBound

如果可以正常运行则不必配置。

Distributed Transaction比较复杂,有问题需要根据问题的exception来查找,不一定都能从上面的方法解决。

---------------------------------------------------

                    分割线

---------------------------------------------------

存储过程 事物:

 

CREATE PROCEDURE testPro
AS
    
/* ------- 事务开始 ---------- */
    
BEGIN TRANSACTION tran_test

    
/* -------- 保存事务 ----------*/
    
SAVE TRANSACTION tran_test

        
/* -------- 数据操作 ---------*/
        
INSERT [table1] ( [content] ) VALUES ( '43332' )

    
/*---------- 提交事务 ------------*/
    
COMMIT TRANSACTION tran_test

    
/*--------- 判断是否有错误 ----------*/
    
IF ( @@ERROR <> 0 )
    
BEGIN
        
/*---------- 自定义错误输出 ----------*/
        
RAISERROR'Insert data error!',16,1 )
        
/*-------- 事务回滚 --------*/
        
ROLLBACK TRANSACTION tran_test
    
END
    
    
/*------- 判断事务数是否大于0 -----------*/
    
IF ( @@TRANCOUNT > 0 )
    
BEGIN
        
/*-------- 事务回滚 --------*/
        
ROLLBACK TRANSACTION tran_test
    
END
GO

举个事务操作的简单例子。

 SQL SERVER存储过程中使用事务

Create PROCEDURE UpdateWanjun
@UserName nvarchar(500),
@UserPassword nvarchar(500),
@ReturnVal int output
AS   
    --Set XAcT_ABORT ON
   Begin Transaction T
       Update admins set UserPassword = @UserPassword where UserName = @UserName
       Update admins set UserPassword = @UserPassword,a='aaadfasdfasdfas' where id=4           --出错语句 ,a为int型,大小为默认值4
       --set @ReturnVal=@@Rowcount(这个变量,只能在紧挨着它的上面SQL下起作用,这样才能返回值,只有放在Update下面才管用)
   
   IF @@Error <> 0
    Begin
       Print '111'  
       RollBack Transaction T
     End
   Else
       print '222'
       COMMIT Transaction T
GO

####################################################################################

如果在一个存储过程中执行调用另一个服务器上的存储过程时,添加事务时需要使用

BEGIN DISTRIBUTED TRANSACTION来开始事务(分布式事务)
BEGIN DISTRIBUTED TRAN [ SACTION ]
      [ transaction_name | @tran_name_variable ]

参数
transaction_name

是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务。transaction_name 必须符合标识符规则,但是仅使用头 32 个字符。

@tran_name_variable

是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。

注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成。当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。

有两个方法可将远程 SQL 服务器登记在一个分布式事务中:

分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。


分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。 
例如,如果在 ServerA 上发出 BEGIN DISTRIBUTED TRANSACTION,该连接调用 ServerB 上的存储过程和 ServerC 上的另一个存储过程,并且 ServerC 上的存储过程对 ServerD 执行一个分布式查询,那么四个 SQL 服务器都进入分布式事务中了。ServerA 是该事务的创建者和控制服务器。

分布式事务 Transact-SQL 涉及的连接并不获取可以传给另一个连接的事务对象,从而也不能用该方法显式登记在分布式事务中。远程服务器登记到事务中的唯一方法是成为远程存储过程调用或分布式查询的目标。

默认情况下,任何有效用户都拥有 BEGIN DISTRIBUTED TRANSACTION 权限。

posted on 2011-08-06 17:22  CarreyWu  阅读(595)  评论(0编辑  收藏  举报

导航