事务(Transaction)是用来设置将连续多个的程序操作必须全部执行成功,否则必须立即答复到未执行任何程序操作的状态

     事务的四大属性 事务中共有四个属性,这四个属性就称为ACID。ACID指的是:不可部分完成性(Atomicity)一致性(Consistency)隔离性(Isolation)与耐久性(Durability)等四种属性

       首先建立一个演示数据库

--建库
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'TransTestDb')
    drop database [TransTestDb]

CREATE DATABASE [TransTestDb];


--建表
use [TransTestDb]
go
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TransTestTable]') AND type in (N'U'))
    drop table [TransTestTable]

CREATE TABLE [dbo].[TransTestTable](Id int, [Name] varchar(16));


--初始值
use [TransTestDb]
go
insert into [TransTestTable]
    select 1,'a' union
    select 2,'b' union
    select 3,'c';

 

     (1)直接在SQL语句中实现。    

begin try
    begin tran
        insert into dbo.TransTestTable values (66,'66');
        update dbo.TransTestTable set [Name] = '77' where [Id] = 66;
        --RAISERROR ('Error raised in TRY block.',16,1);
    commit tran
end try
begin catch
    rollback tran
end catch

    (2)利用对象SqlTransaction实现,一般通过SqlConnection 对象的BeginTransaction()方法创建,当然也可以先创建SqlTransaction事务对象,然后设置Connection属性。

 public static int ExecuteSqlTran(List<String> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }


     SqlTransaction 对象有Commit(),Rollback()Rollback(string) ,Save(string) 几个常用的方法。

    Commit():指示事务已经执行完成,同sql语句中执行commit指令。

    Rollback()从挂起状态回滚事务。

     Save(string),Rollback(string) :这两个方法一般配套使用,前者表示在事务的过程中创建一个保存点;后者表示回滚到指定的保存点。

 

 

    (3)TransactionScope对象实现事务控制,此对象有一个Complete方法指示事务完成。没有其他的事务操作函数,一般放在using指令后,如果其中发生异常或者错误,都直接回滚。

    

 public static int ExecuteSqlTran(List<String> SQLStringList) {
   using (TransactionScope scope = new TransactionScope())
   {
       SqlConnection conn = new SqlConnection(connectionString)
       sqlConn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
       sqlConn.Close();
       scope.Complete();
     }

  }