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

  • FUNKER530 - Veteran Community & Combat Footage

    FUNKER530 -

    25 Ocak 2007
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Maschine Tutorials

    Maschine Tut

    15 ŞUBAT 2011