如何实现交易?

时间:2013-03-07 10:15:17

标签: c# sql

我正在研究sql,我的查询是我有一些方法,我在做不同的任务。例如:- 第一种方法 - 插入 第二种方法 - 更新 第三种方法 - 删除 第四种方法 - 插入

现在我想一次执行所有这些。但如果出现任何错误,那么整个过程就会自行回滚。

代码:

private void btnSubmit_Click(object sender, EventArgs e)
{
    DialogResult dr = MessageBox.Show("Are you sure you want to submit the information? Click 'Yes' to Submit or 'No' to re-Check.", "eParty - Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
    if (dr == DialogResult.Yes)
    {
        this.Cursor = Cursors.WaitCursor;

        INSERT();
        UPDATE();
        DELETE();
        INSERTAGAIN();

        MessageBox.Show("Booked successfully.", "eParty - Done!", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.Cursor = Cursors.Default;

        this.Cursor = Cursors.WaitCursor;

        this.Close();
    }
    else
    {

    }
}

现在如何在'btnSubmit_Click'方法实现Transaction ...

7 个答案:

答案 0 :(得分:2)

试试这个:

  using(var scope = new TransactionScope())
  {
    INSERT();
    UPDATE();
    DELETE();
    INSERTAGAIN();

    scope.Complete(); //if we make it here - commit the changes, 
                      //if not - everything is rolled back

  }

请记住将System.Transactions包含在项目中

答案 1 :(得分:0)

这取决于您拥有的数据库访问技术。

如果您使用实体框架,SaveChanges()方法已经拥有交易支持。

如果是纯ADO.NET,请参阅此https://stackoverflow.com/a/224702/210994

答案 2 :(得分:0)

您可以使用ADO交易并将交易作为参数发送到您的所有方法

SqlConnection db = new SqlConnection("connstringhere");
SqlTransaction transaction;
db.Open();
transaction = db.BeginTransaction();
try 
{
     INSERT(transaction);
     UPDATE(transaction);
     DELETE(transaction);
     INSERT(transaction);
     transaction.Commit();
} 
catch (SqlException sqlError) 
{
     transaction.Rollback();
}

答案 3 :(得分:0)

请参阅此主题:Implementing an Implicit Transaction using Transaction Scope

  

TransactionScope类提供了一种标记块的简单方法   代码参与交易,无需您   与交易本身互动。事务范围可以选择   并自动管理环境事务。由于它的易用性   使用和效率,建议您使用   开发事务应用程序时的TransactionScope类。在   另外,你不需要明确地用资源登记资源   交易即可。任何System.Transactions资源管理器(例如SQL)   Server 2005)可以检测环境事务的存在   由范围创建并自动登记。

我还建议您阅读此question及其答案。它涉及有关在多个连接上使用事务的有趣话题。

答案 4 :(得分:0)

通常类似于:

void DoStuff(args)
{
    using (var conn = CreateOpenConnection())
    using (var tran = conn.BeginTransaction())
    {
        try
        {
            // various operations here
            ForExample(conn, tran);
            tran.Commit();
        }
        catch
        {
            tran.Rollback();
            throw;
        }
    }
}

void ForExample(DbConnection conn, DbTransaction tran = null)
{
    using (var cmd = conn.CreateCommand())
    {
        cmd.Transaction = tran;
        cmd.CommandText = "For example";
        // cmd.Parameters.Add(...)
        cmd.ExecuteNonQuery();
    }
}

虽然可以使用原始ADO.NET上方的任何可用工具/库来减少大部分工作/库。

答案 5 :(得分:0)

您可以使用.Net的TransactionScope类来实现此目的。 http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx 您可以根据需要选择隔离级别。如果您不确定,请使用Serializable级别,该级别是最一致且性能最低的级别。但是如果你的sql存储过程具有隔离级别,它们将获得优先权。如果这是一个关键设计,请在继续之前阅读有关交易的信息。

答案 6 :(得分:0)

也许你应该创建一个存储过程并根据参数执行你的CRUD操作。例如:

    BEGIN TRANSACTION

    IF(@PartyID <= 0)
    BEGIN
        //INSERT
    IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    END
    ELSE
    BEGIN
        //UPDATE
    IF @@ERROR <> 0
        BEGIN
            ROLLBACK TRANSACTION
            RETURN
        END
    END