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

转至: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/p/2111749.html