SQL连接和事务

时间:2011-08-26 13:00:54

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

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

我们有一个数据库助手类,包含begin-commit-和rollbacktransactions的方法,以及通常的select,execute stored proc等。

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

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
}

只要存在现有事务并且在提交或回滚期间将其关闭,辅助类当前就会保持连接处于打开状态。但是它让我想知道这是否真的是最好的方法呢?连接是否必须在交易期间保持打开状态?

2 个答案:

答案 0 :(得分:2)

是的,它必须保持开放。您可以处理类的OnDispose并在其中处理连接。

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

然后你可以做......

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

答案 1 :(得分:1)

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

e.g:

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