【问题标题】:SQL Connections and transactionsSQL 连接和事务
【发布时间】:2011-08-26 21:10:04
【问题描述】:

您是否必须在事务期间保持(相同的)SQL 连接打开,并且您是否必须在调用 BeginTransaction 的同一连接上调用 CommitTransaction 和 RollbackTransaction。

我们有一个数据库助手类,其中包含开始提交和回滚事务的方法,以及通常的选择、执行存储过程等。

帮助类看起来或多或少像这样:

public class DatabaseHelper
{
    public void BeginTransaction()
    {
         // open connection, but dont close it.
    }

    public void CommitTransaction()
    {
         // close the connection
    }

    public void RollbackTransaction()
    {
         // close the connection
    }

因此,我们不能像这样做通常的(我更喜欢的):

using (sqlCon = new SqlConnection(connectionString))
{
    // sql operations here
}

只要存在现有事务,帮助程序类当前就使连接保持打开状态,并在提交或回滚期间将其关闭。然而,这让我想知道这是否真的是最好的方法?连接是否必须在事务期间保持打开状态?

【问题讨论】:

  • 你如何与那个助手一起工作? BeginTransaction 至少应返回您将传递回 Commit 方法的事务!
  • 是的,我也不喜欢它,但我正在修复由其他人编写的现有生产代码,因此希望对已经测试和“工作”的内容进行尽可能少的更改.

标签: c# sql-server transactions database-connection


【解决方案1】:

是的,它必须保持打开状态。您可以在其中处理类的 OnDispose 和连接的 Dispose。

public class DatabaseHelper : IDisposable
{
    public void Dispose()
    {
        //close/dispose connection here
    }
}

那你可以做...

using(DatabaseHelper db = new DatabaseHelper())
{
}

【讨论】:

  • @Ghlouw :如果你实现了 musefan 的建议,在你的 Dispose 中你还可以检查连接是否仍然打开,如果是这样,如果你愿意,提交你的更改。或者,如果您愿意,您可以显式回滚,但正如 Ben Robinson 所说,如果您的 SQL 会话因未决更改而终止,它将自动回滚。
  • @Tipx,我认为 dispose 的默认设置应该是回滚,如果仍有待处理的事务。在发生错误的情况下假设默认提交是不好的,这样开发人员没有明确要求提交
  • 我也这么认为,但我只是指出他可以,如果他愿意的话!
【解决方案2】:

如果在提交之前关闭连接,我很确定事务会自动回滚。您的助手类不必创建和处置连接来管理事务以及连接的打开和关闭,只需在构造函数中使用连接参数,然后您就可以使用通常的 using 语法。

例如:

using (sqlCon = new SqlConnection(connectionString))
{
    DatabaseHelper helper = new DatabaseHelper(sqlCon);
    helper.BeginTransaction();
    try
    {
        //Sql stuff
        helper.CommitTransaction();
    }
    catch(SqlException)
    {
         helper.RollbackTransaction();
    }
}

【讨论】:

  • 它们是回滚的,但是如果你想自己检查,你可以在事务启动后闯入代码,并锁定表,如果表被锁定,请使用 SQL 客户端检查。如果是这样,只需停止调试器,然后确认表不再锁定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2011-06-26
  • 2010-10-13
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多