SORU
27 Mayıs 2010, PERŞEMBE


Current Zamanından Önce Tamamlandı

Bir Current içinde çalışan kod bloğu var ve bu kod bloğu içinde DB ile birkaç telefon görüşmesi yaptım. Seçer, Güncellemeler Oluşturur ve Siler, bütün gam. Benim silmek öldürdüğümde bu sorgu çıkmaza girdi potansiyel olarak eğer kilitlenme olursa sorguyu otomatik olarak yeniden olacak SqlCommand uzantısı yöntemi kullanarak yürütmek.

Sorun çıkmaza girdi oluşur inanıyorum ve işlevi sorguyu yeniden göndermek için çalışır. Bu aldığım hata:

Bu işlem, geçerli bağlantı ile ilişkili tamamlandı ama bertaraf edilmiş değil. Bu işlem bağlantı SQL ifadeleri çalıştırmak için kullanılabilir önce atılmalıdır.

Bu sorgu (Current kullanarak içinde yürütür altındaki tüm kod) çalıştırılır basit bir kod

using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App))
{
    sqlCommand.Connection.Open();
    sqlCommand.ExecuteNonQueryWithDeadlockHandling();
}

Burada çıkmaza sorgu yeniden gönderir uzatma yöntemi:

public static class SqlCommandExtender
{
    private const int DEADLOCK_ERROR = 1205;
    private const int MAXIMUM_DEADLOCK_RETRIES = 5;
    private const int SLEEP_INCREMENT = 100;

    public static void ExecuteNonQueryWithDeadlockHandling(this SqlCommand sqlCommand)
    {
        int count = 0;
        SqlException deadlockException = null;

        do
        {
            if (count > 0) Thread.Sleep(count * SLEEP_INCREMENT);
            deadlockException = ExecuteNonQuery(sqlCommand);
            count  ;
        }
        while (deadlockException != null && count < MAXIMUM_DEADLOCK_RETRIES);

        if (deadlockException != null) throw deadlockException;
    }

    private static SqlException ExecuteNonQuery(SqlCommand sqlCommand)
    {
        try
        {
            sqlCommand.ExecuteNonQuery();
        }
        catch (SqlException exception)
        {
            if (exception.Number == DEADLOCK_ERROR) return exception;
            throw;
        }

        return null;
    }
}

Hata satırında oluşur:

sqlCommand.ExecuteNonQuery();

CEVAP
8 HAZİRAN 2010, Salı


Senin Current seçin ifadelerinizi gizlensin unutma. (Nolock) ile kullandığınızda SQL Server 2005 ve üzerinde, kilitler hala bu tabloları seçin dokunur oluşturulur. Şuna bir bak, sana how to setup and use TransactionScope gösterir.

using(TransactionScope ts = new TransactionScope 
{ 
  // db calls here are in the transaction 
  using(TransactionScope tsSuppressed = new TransactionScope (TransactionScopeOption.Suppress)) 
  { 
    // all db calls here are now not in the transaction 
  } 
} 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AndyMcMillinTV

    AndyMcMillin

    6 HAZİRAN 2007
  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • TheFlightsuit

    TheFlightsui

    22 HAZİRAN 2009