zoukankan      html  css  js  c++  java
  • 在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" 即可
    以上是我个人在实际工作中总结的一些经验,好不好还需要大家的评论了,其中如有不足的地方,还希望大家能帮我指出.

  • 相关阅读:
    进程与线程
    silverlight中的几个冷门标记 {x:Null},d:DesignWidth,d:DesignHeight
    silverlight数据绑定模式TwoWay,OneWay,OneTime的研究
    silverlight 相册雏型
    IIS7的应用程序池
    silverlight如何在运行时用代码动态控制(或创建)动画
    庆祝silverlight 4 beta版发布,上几张养眼MM照片
    [转贴]Silverlight Socket 实现收发信息
    IIS7.5中神秘的ApplicationPoolIdentity
    silverlight中如何将string(字符串)写入Resource(资源)?
  • 原文地址:https://www.cnblogs.com/ceci/p/2111749.html
Copyright © 2011-2022 走看看