日期:2014-05-20  浏览次数:20834 次

.net中交易处理的解决方案
在数据库软件中,其核心就是对数据库记录进行查询添加修改及删除操作,这是非常关键的也是必须非常谨慎的去完成。在现有的程序中经常会有因为某些错误而造成数据丢失甚至是系统崩溃,这就对我们的程序提出了一个数据操作的错误处理要求。  

例如在进行银行转帐处理时,我们先从转出帐号减掉要转出的金额,然后再在接收的帐号上加上相应的金额。如果一切处理OK,我们的钱能顺利到达接收帐号。但要是系统在执行接收金额的步骤上出错了,那么不但自已钱变少了,该收到的人也没有收到,那笔钱就这样消失了.这是一个很危险的现像。解决办法就是要对数据操作的每一步都进行错误监控,一旦发现出错了,马上恢复数据至整个操作前的原始状态。.NET中提出了一个交易(Transaction)的观念,可以解决此类问题。  

我现在来用交易实现上面的例子:  

string   sql1   =   "... ";   //在转出帐号上减去金额的处理SQL语句  
string   sql2   =   "... ";   //在接收帐号上加上金额的处理SQL语句  
SqlConnection   conn   =   new   SqlConnection( "... ");   //建立数据库连接  
conn.Open();   //接开数据库连接  
SqlTransaction   tran   =   conn.BeginTransaction();   //开始进行交易处理  
SqlCommand   comm   =   new   SqlCommand();  
comm.Connection   =   conn;  
comm.Transaction   =   tran;  
try  
{  
comm.CommandText   =   sql1;  
comm.ExecuteNonQuery();  
comm.CommandText   =   sql2;  
comm.ExecuteNonQuery();  
tran.Commit();   //接受交易,完成操作  
}catch  
{  
tran.Rollback();   //交易失败,恢复数据  
}  
finally  
{  
conn.Close();   //关闭数据库连接。  
}  

其实还有另外一种方法也可以实现以上目标。在transaction-sql中也提供了交易处理的方法(我想上种方法最终实现还是转换为此方法实现的).我们可以把以上处理建立为一个存储过程,然后再用SqlCommand进行调用,这个存储过程的主要的相关内容为(其中...处代表要进行数据库记录操作的多条SQL语句):  

BEGIN   TRANSACTION  
...  
IF   (@@ERROR   >   0)   ROLLBACK   TRANSACTION  
ELSE   COMMIT   TRANSACTION  


以上方法使用的是sql   server的事务处理,针对同一数据服务器。如果需要针对不同的服务器,在.net2中我们可以使用System.Transaction.TransactionScope或者System.Enterprises命名空间中的类生成企业集解决方案,这两种方法都使用了Microsoft的msdtc分布式事务处理机制,使用非常方便,以下用TransactionScope作示例:

 

using(TransactionScope   ts   =   new   TransactionScope())

{

//执行语句1

//执行语句2

 

//事务提交

ts.complete();

}


http://bbs.csai.cn/bbs/view.asp?Id={DA39C759-2E86-4B42-827E-C64A7BEFC0C4


------解决方案--------------------
同时操作两个数据库服务器,如何保证数据的一致性、完整性呢?请大家思考!
------解决方案--------------------
谢谢. 参考!
------解决方案--------------------
谢谢
------解决方案--------------------
com+
------解决方案--------------------
谢谢
------解决方案--------------------
up learn
------解决方案--------------------
帮你顶一下
------解决方案--------------------
那叫事务处理!

什么交易?好好弄懂了再来臭显摆!
------解决方案--------------------
.net框架1.1中是不支持两个不同数据库之间的事务的(主要是限制oracle),但是在2.0中放开了限制。