C#事务处理

一:事物的特点(ACID)
1:原子性,要么全部执行,要么全部不执行
2:一致性
3:隔离性
4:持久性

二:操作事务的典型步骤
1:创建一个Connection对象,建立与数据库的连接
    SqlConnection myConnection = new SqlConnection(connectString);
    myConnection.Open();
2:使用Connection.BeginTransaction方法创建一个Transaction对象,启动本地事务。
    SqlTransaction myTrans = myConnection.BeginTransaction();
3:创建一个Command对象
    SqlCommand myCommand = myConnection.CreateCommand();
4:将Transaction对象分配给Command对象的Transaction属性
    myCommand.Transaction = myTrans;
5:执行数据库命令
    cmd.CommandText = "Insert into...."
    cmd.ExecuteNonQuery();
6:根据命令的执行结果调Commit提交事务或Rollback方法取消事务。
    myTrans.Commit();
    myTrans.Rollback();

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertOrder]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[InsertOrder]
    --从当前数据库中删除一个或多个存储过程或过程组。
    GO

    SET QUOTED_IDENTIFIER OFF
    --当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。
    --当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。
    GO
    SET ANSI_NULLS OFF
    --当设置为 ON 时,所有与空值比较的值都取值为 NULL(未知)。
    --当设置为 OFF 时,如果两个值都为 NULL,则非 Unicode 值与空值比较的值都取值为 TRUE。
    GO
    use northwind
    GO

    --------------------------------------------------
    -- InsertOrder
    --------------------------------------------------
    CREATE PROCEDURE InsertOrder

        @CustomerID     nchar(5),
        @EmployeeID        int,
        @OrderDate         datetime,
        @RequiredDate     datetime,
        @ShippedDate     datetime,
        @ShipAddress     nvarchar(60),
        @Id         int OUTPUT
    AS

        BEGIN TRANSACTION

            -- Insert Values into the Orders table
            INSERT Into Orders(
                CustomerID,
                 EmployeeID,
                OrderDate,
                 RequiredDate,
                 ShippedDate,
                 ShipAddress
                )Values(
                 @CustomerID,
                 @EmployeeID,
                 @OrderDate,
                 @RequiredDate,
                 @ShippedDate,
                 @ShipAddress
                )

            -- Get the new Order Identifier, return as OUTPUT param
            SELECT @Id = @@IDENTITY

        COMMIT TRANSACTION

        RETURN 0
    --------------------------------------------------
    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

三:示例
    public void RunSqlTransaction(string myConnString)
    {
        SqlConnection myConnection = new SqlConnection(myConnString);
        SqlCommand myCommand = myConnection.CreateCommand();
        SqlTransaction myTrans;
        myTrans = myConnection.BeginTransaction();
        myCommand.Connection = myConnection;
        myCommand.Transaction = myTrans;
        try
        {
            myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, ´Description´)";
            myCommand.ExecuteNonQuery();
            myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, ´Description´)";
            myCommand.ExecuteNonQuery();
            myTrans.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception e)
        {
            try
            {
                myTrans.Rollback();
            }
            catch (SqlException ex)
            {
                if (myTrans.Connection != null)
                {
                    Console.WriteLine("An exception of type " + ex.GetType() +
                        " was encountered while attempting to roll back the transaction.");
                }
            }
            Console.WriteLine("An exception of type " + e.GetType() +
            " was encountered while inserting the data.");
            Console.WriteLine("Neither record was written to database.");
        }
        finally
        {
            myConnection.Close();
        }
    }

你可能感兴趣的:(C#事务处理)