how to use sqltransaction in c#

前端 未结 6 2121
执笔经年
执笔经年 2020-12-05 10:56

I am using following code to execute two commands at once. I used sqltransaction to assure either all command get executed or rolled back.When I run my program without \"tra

6条回答
  •  眼角桃花
    2020-12-05 11:16

    You can create a SqlTransaction from a SqlConnection.

    And use it to create any number of SqlCommands

    SqlTransaction transaction = connection.BeginTransaction();
    var cmd1 = new SqlCommand(command1Text, connection, transaction);
    var cmd2 = new SqlCommand(command2Text, connection, transaction);
    

    Or

    var cmd1 = new SqlCommand(command1Text, connection, connection.BeginTransaction());
    var cmd2 = new SqlCommand(command2Text, connection, cmd1.Transaction);
    

    If the failure of commands never cause unexpected changes don't use transaction.

    if the failure of commands might cause unexpected changes put them in a Try/Catch block and rollback the operation in another Try/Catch block.

    Why another try/catch? According to MSDN:

    Try/Catch exception handling should always be used when rolling back a transaction. A Rollback generates an InvalidOperationException if the connection is terminated or if the transaction has already been rolled back on the server.

    Here is a sample code:

    string connStr = "[connection string]";
    string cmdTxt = "[t-sql command text]";
    
    using (var conn = new SqlConnection(connStr))
    {
        conn.Open();
        var cmd = new SqlCommand(cmdTxt, conn, conn.BeginTransaction());
    
    
        try
        {
            cmd.ExecuteNonQuery();
            //before this line, nothing has happened yet
            cmd.Transaction.Commit();
        }
        catch(System.Exception ex)
        {
            //You should always use a Try/Catch for transaction's rollback
            try
            {
                cmd.Transaction.Rollback();
            }
            catch(System.Exception ex2)
            {
                throw ex2;
            }
            throw ex;
        }
    
        conn.Close();
    }
    

    The transaction is rolled back in the event it is disposed before Commit or Rollback is called.

    So you don't need to worry about app being closed.

提交回复
热议问题