在web开发中的三个层次使用事务(C#编程)(转)

本文介绍了ASP.NET中实现数据库事务处理的三种方法:存储过程层次、ADO.NET层次及页面层次,并提供了具体示例代码。

转至:http://bbs.chinaunix.net/archiver/tid-2331601.html
[b]在web开发中的三个层次使用事务(C#编程) [/b]

很多数据库操作需要进行事务,Asp.net下面进行事务大致有3个层次:  
(1)存储过程层次的事务  
(2)Ado.Net层次的事务  
(3)Asp.Net页面层次的事务  
下面分别举例:  
首先建立trantest表,字段id(int),test(char)  
为id设置主键(利用主键是不允许重复的特性进行事务测试)  
假设数据库内存在记录id=1,test='test'
(1)

 

CREATE   PROCEDURE  Tran1  
as   
begin   tran   
set  xact_abort  on  
Insert   Into  trantest (id,test) values ( 1 , ' test ' )  
Insert   Into  trantest (id,test) values ( 2 , ' test ' )  
commit   tran   
GO   
set  xact_abort  on   表示遇到错误立即回滚 
当然你也可以这么写 
CREATE   PROCEDURE  tran1 
as  
begin   tran  
insert   into  trantest(id,test) values ( 1 , ' test '
if ( @@error <> 0
rollback   tran  
else  
begin  
  
insert   into  trantest(id,test) values ( 2 , ' test '
  
if ( @@error <> 0
   
rollback   tran  
  
else  
   
commit   tran  
end  
GO

2)

 

SqlConnection conn = new  SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ " conn " ]);  
SqlCommand cmd1
= new  SqlCommand( " Insert Into trantest (id,test)values(1,'test') " ,conn);  
SqlCommand cmd2
= new  SqlCommand( " Insert Into trantest (id,test)values(1,'test') " ,conn);  
conn.Open();  
SqlTransaction tran
= conn.BeginTransaction();  
cmd1.Transaction
= tran;  
cmd2.Transaction
= tran;  
try   
{  
cmd1.ExecuteNonQuery();  
cmd2.ExecuteNonQuery();  
tran.Commit();  
}  
catch (SqlException except)  
{  
tran.Rollback();  
Response.Write(except.Message);  
}  
finally   
{  
conn.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;}


 

(3)  

添加引用System.EnterpriseServices.dll  
[code]
using  System.EnterpriseServices;  

随便建立一个按钮,在按钮中进行如下操作: 
try   
{  
work1();  
work2();  
ContextUtil.SetComplete();  
}  
catch (System.Exception except)  
{  
ContextUtil.SetAbort();  
Response.Write(except.Message);  
}  

然后在页面中添加2个操作,模拟一下在逻辑层调用不同类中的操作的情况  
private   void  work1()  
  {  
   SqlConnection conn
= new  SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ " conn " ]);  
   SqlCommand cmd1
= new  SqlCommand( " Insert Into trantest (id,test)values(1,'test') " ,conn);  
   conn.Open();  
   cmd1.ExecuteNonQuery();  
   conn.Close();  
  }  

  
private   void  work2()  
  {  
   SqlConnection conn
= new  SqlConnection(System.Configuration.ConfigurationSettings.AppSettings[ " conn " ]);  
   SqlCommand cmd2
= new  SqlCommand( " Insert Into trantest (id,test)values(2,'test') " ,conn);  
   conn.Open();  
   cmd2.ExecuteNonQuery();  
   conn.Close();  
  } 


修改前台页面在<%Page后面添加 Transaction="Required" 即可
以上是我个人在实际工作中总结的一些经验,好不好还需要大家的评论了,其中如有不足的地方,还希望大家能帮我指出.

转载于:https://www.cnblogs.com/ceci/archive/2011/07/20/2111749.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值