您的位置:首页 > 编程学习 > ASP.NET > 正文

SqlTransaction事务的用法

更多 时间:2013-11-1 类别:编程学习 浏览量:7507

SqlTransaction事务的用法

SqlTransaction事务的用法

transaction事务

事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中永久的组成部分。若果事务遇到错误,则必须取消或回滚,所有数据均被更改清除。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

 

transaction属性:

1.原子性:事务是一个完整的操作,事务的各元素师不可分的。

2.一致性:事务开始时和完成时,数据必须处于一致的状态。

3.隔离性:对数据进行修改的所有并发事务是彼此隔离的。

4.持久性:事务完成后,它对系统的影响是永久的。

 

使用SqlTransaction实现数据库操作事务

SqlTransaction类是对SQL Server数据库进行事务处理的类,该类的实例由SqlConnection类实例的BeginTransaction方法创建,表示在该数据库连接实例上开始一个数据库事务,创建SqlTransaction类实例后,在程序中使用该实例的Commit方法提交事务,或者使用该类的Rollback方法回滚事务。

 

SqlTransaction示例

下面的示例创建一个 SqlConnection 和一个 SqlTransaction。此示例演示如何使用BeginTransactionCommitRollback 等方法。出现任何错误时事务都会回滚。Try/Catch 错误处理用于处理尝试提交或回滚事务时的所有错误。

  •  
  • C# 代码   复制
  • using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using CNTVS.TOOLS;
     
    public partial class _Default : System.Web.UI.Page 
    {
         protected void Page_Load(object sender, EventArgs e)
         {
             
         }
         protected void Button1_Click(object sender, EventArgs e)
         {
             SqlConnection conn = Database.GetConn();
             SqlTransaction st = conn.BeginTransaction();
             try
             {
                
                 string sql = "Insert Into T_Test(F_Name) values('A')";            
                 Database.ExecuteNonQuery(st, CommandType.Text, sql);
     
                //这里会报错,在挂起的事务中,该事务分配的连接,不能再独占使用
                 //string A = Database.ExecuteScalarToStr(conn,CommandType.Text,"Select F_ID From T_Test where F_Name='A'");
                 
                 sql = "Insert Into T_Test2(F_ID,F_Age) values(1,2)";
                 Database.ExecuteNonQuery(st, CommandType.Text, sql);
                 st.Commit();           
               
             }
             catch (Exception Ex)
             {
                 st.Rollback();
                 Website.WriteError(Ex);
             }
             finally 
             {
                 Database.Dispose(conn);
             }
         }
     }
    		
  •  

    注意:在提交或回滚 SqlTransaction 时,应始终使用 Try/Catch 进行异常处理。如果连接终止或事务已在服务器上回滚,则Commit 和Rollback 都会生成InvalidOperationException

     

    事务的误区

    事务有很多优点【原理中已经阐述】,由于它的要求比较高,所以注意事务不能滥用,如果用不好就会造成很大的麻烦。

    事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性,事务必须具备 ACID 属性,即原子性、一致性、隔离性和持续性。这是MSDN的权威说明。

    也许针对一般的小逻辑、小数据事务应用非常的高效、可靠。但如果数据量很大,在单个事务中集合的操作繁多而且复杂,事务的致命伤就会暴露出来。一个事务进行时,必须保证边界资源的原子性、一致性、隔离性和持续性。

    我曾经设计了一个测试用例,测试事务在执行时对资源的利用情况。测试结果很令人惊讶:在事务执行时,独占事务涉及到的数据表,造成其它操作词表的功能,因等待时间过长,而暴跳“获得数据连接超时”的警告。