SQL-соединения и транзакции - PullRequest
2 голосов
/ 26 августа 2011

Нужно ли держать (одно и то же) соединение SQL открытым в течение транзакции, и нужно ли вам вызывать CommitTransaction и RollbackTransaction для того же соединения, которое вызвало BeginTransaction.

У нас есть вспомогательный класс базы данных с методами для начала-совершения-откатывания транзакций, а также обычного выбора, выполнения сохраненной процедуры и т. Д.

Вспомогательный класс выглядит примерно так:

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 ]

2 голосов
/ 26 августа 2011

Да, он должен остаться открытым.Вы можете обрабатывать OnDispose вашего класса и избавляться от соединения в этом.

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

Тогда вы могли бы сделать ...

using(DatabaseHelper db = new DatabaseHelper())
{
}
1 голос
/ 26 августа 2011

Я почти уверен, что транзакция откатывается автоматически, если соединение было закрыто перед фиксацией. Вашему вспомогательному классу не нужно создавать и распоряжаться соединением для управления транзакциями, а также открытием и закрытием соединения, просто пусть он принимает параметр соединения в конструкторе, и вы можете использовать свой обычный синтаксис.

например:.

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