Transaction Lock problemi

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Transaction Lock problemi

Mesaj gönderen Okann »

Merhaba arkadaşlar,

table ile bir insert yapıyorum. bu insert yaklaşık 2 dk sürüyor. bu esnada transaction kullanıyorum. database nesnesine transaction açıyorum.
işlem bitene kadar tabloya erişim engelleniyor doğal olarak. bu engeli nasıl kaldırırız.

yardım ederseniz çok sevinirim.
Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 05:43
İletişim:

Re: Transaction Lock problemi

Mesaj gönderen barisatalay »

MsSql ise aşağıdaki NoLock komutunu kullanabilirsiniz.

Kod: Tümünü seç

Select * from Tabloadı T (NOLOCK)
Left Join Tablo2 (NOLOCK) on k K.RecId= T.RecId

vs.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Transaction Lock problemi

Mesaj gönderen Okann »

merhaba,

excelden verileri databaseye aktarıyorum. bu esnada transaction kullanıyorumki herhangi bir hatada yapılan işlemleri geri alsın diye.

siz select nolock gibi bir ifade kullanmışsınız. fakat ben insertten bahsetmiştim. aynı şekilde birçok kullanıcı excelden insert yapabilir. fakat database trasaction açıldığı için diğer kulllanıcılar o an excelden aktarım yapamıyor. demek istediğim budur. veya başka bir kullanıcı o tabloya erişmek istediğinde erişemiyor.
bu transaction açıldığında tablo lock olmadan işleme devam edebilme durumu yokmu merak ettiğim budur.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Transaction Lock problemi

Mesaj gönderen sabanakman »

Bu nasıl erişmek isteyeceğiniz ile alakalı değişir. Diğer taraftan kayıtların değiştirilen haliyle mi yoksa değişmemiş haliyle mi açmanız gerekiyor. Bunun için "Isolation Level" başlığı altında çalışma yapmanız gerekmektedir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Transaction Lock problemi

Mesaj gönderen Okann »

Şaban hocam merhaba,

aslında değişip değişmemiş haliyle görülmesinin çok önemi olamayacak benim için, sadece erişilebilmesi yeterli. aşağıdaki gibi bir excelden aktarım kullanıyorum.


Kod: Tümünü seç

procedure TfrmMain.Connect;
begin
        if db.Connected then
        begin
          tblItems.TableName := 'TD_ITEMS';
          tblItems.FilterSQL := ''' WHERE SUPPLIER '' = ''' + Supplier + '''';
          tblItems.Active := True;
        end;
end;

Kod: Tümünü seç

procedure TfrmMain.ExcelToDatabase;
var
  AppName: PChar;
const
  xlCellTypeLastCell = $0000000B;
var
  Book, Excel, Sheet: Variant;
  Satir, Sutun: Integer;
  Str: string;
begin
  pb.Position := 0;
  pb.Visible := True;
  db.StartTransaction;
  try
    sb.Panels[0].Text := 'Stok güncellemesi yapılıyor...';
    with QItemsProcess do
    begin
      SQL.Clear;
      SQL.Add('DELETE FROM TD_ITEMS WHERE SUPPLIER = ''' + Supplier + '''');
      ExecSQL;
    end;
    Excel := CreateOleObject('Excel.Application');
    Book := Excel.WorkBooks.Open(frmSettings.edtExcelFileDir.FileName);
    Screen.Cursor := crDefault;
    try
      Sheet := Book.WorkSheets[1];
      Satir := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row;
      pb.Properties.Max := Satir;
      for Satir := 2 to Satir do
      begin
        pb.Position := Satir;
        pb.Refresh;
        str := Sheet.Cells[Satir, 2];
        begin
          if (str <> '') then
          begin
            Update;
            tblItems.Append;
            for Sutun := 1 to 4 do
            begin
              tblItems.Fields[Sutun].AsString := Sheet.Cells[Satir, Sutun];
            end;
            tblItems.Post;
          end;
          Application.ProcessMessages;
        end;
      end;
      with QItemsProcess do
      begin
        SQL.Clear;
        SQL.Add('UPDATE TD_ITEMS SET DATE_ = GETDATE() WHERE SUPPLIER = ''' + Supplier + '''');
        ExecSQL;
      end;
      db.Commit;
      with frmItems.QItems do
      begin
        SQL.Clear;
        SQL.Add('SELECT * FROM TD_ITEMS WHERE SUPPLIER = ''' + frmMain.Supplier + '''');
        ExecSQL;
      end;
      sb.Panels[0].Text := 'Stok güncellemesi tamamlandı...';
    finally
      Screen.Cursor := crDefault;
      if not VarIsEmpty(Excel) then
      begin
        Excel.DisplayAlerts := False;
        Excel.Quit;
        Excel := Unassigned;
      end;
      tmrAutoUpdateItems.Enabled := True;
      pb.Visible := False;
      pb.Position := 0;
    end;
  except
    on E : Exception do
    begin
      db.Rollback;
      ShowMessage('Hata Sınıfı: ' + E.ClassName + #13#10 +
                  'Hata Mesajı: ' + E.Message + #13#10 + #13#10 +
                  'Güncelleme sırasında bir hata oluştu. Program şimdi yeniden başlatılacak.');
      if not VarIsEmpty(Excel) then
      begin
        Excel.DisplayAlerts := False;
        Excel.Quit;
        Excel := Unassigned;
      end;
      AppName := PChar(Application.ExeName);
      ShellExecute(Handle, 'Open', AppName, nil, nil, SW_SHOWNORMAL);
      Application.Terminate;
    end;
  end;
end;
En son Okann tarafından 14 Ara 2014 09:03 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Transaction Lock problemi

Mesaj gönderen Okann »

aynı anda 20 farklı kullanıcı tabloya insert yapabilecek. 1 kullanıcı ise select çekecek. biri excelden aktarıma başladığı anda diğeri aktarım yapamıyor. Çünkü her kullanıcının exesi aktarım yapacağı zaman transaction açıyor.
biri transaction açtığı zaman diğer kullanıcı açamıyor. ve program hataya düşüyor.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Transaction Lock problemi

Mesaj gönderen thelvaci »

Öncelikle, insert işleminin 2 dakika sürmesi ilginç; 2 dakika boyunca bir kaynağın lock durumunda kalması pek çok soruna neden olur. İşlemin neden 2 dakika sürdüğünü araştırıp bu süreyi azaltma cihetine gitmelisiniz öncelikle.

Transaction işlemleri atomik işlemlerdir, tıpkı critical section, mutex, event vb. mekanizmalara benzerler; zaten altta bu mekanizmalardan faydalanılır. Veritabanınızın ne olduğunu belirtmemişsiniz, bu durumda ben SQL Server'a göre yanıt vermeye çalışacağım. SQL Server bir kaynağa mümkün mertebe shared lock koymaya çalışır, tabii siz aksini belirtmedi iseniz. Ancak; konulan lock ilgili kaynağın kapsamında büyümeye başladığında, öncelikle page level lock ardından da table level lock koyar. Buna lock escalation adı verilir.

Mümkün mertebe transactionlarınızı kısa zaman dilimleri içerisinde başlatıp sonlandırmalısınız. Bu nedenle, kodunuzda transaction'ı başlattığınız ve sonlandırdığınız yerleri yeniden gözden geçirmek isteyebilirsiniz. Aynı zamanda daha önce de ifade ettiğim gibi, kodunuzu hızlandırmanın bir yolunu bulmalısınız.

COM yada OLE ile Excel'e erişip, variantlar üzerinden işlem yapmak son derece yavaştır. Belki bunun yerine ADO bileşenleri ile excel'e erişerek işlemlerinizi biraz daha hızlandırabilirsiniz. Tüm bunların yanında, Excel'den verilerinizi aktardığınız tabloyu kullanıcıların sorguladığı tablonun haricinde bir tablo olarak ayarlayabilirsiniz. Böylece işlem bittiğinde, temp tablonuzdan gerçek tablonuza tek bir INSERT deyimi ile tüm kayıtları aktarabilir ve kullanıcılarınızın beklemesini engelleyebilirsiniz.

Yada pek önermesem de, NOLOCK, READPAST gibi table hintlerinden istifade ederek; kullanıcılarınızın kilitlenmiş kaynaklardan veri okumasını sağlayabilirsiniz. Ancak bu durumda, dirty read ve phantom records gibi sorunlar ile karşılaşırsınız.

Yada transaction isolation seviyesini snapshot isolation seviyesine ayarlayabilir; lock'lamanın kısıtlarından mümkün mertebe en az etkilenirsiniz. Bunun için yine bu forumda, paylaştığım bazı bilgiler olacaktı, araştırarak bulabilirsiniz sanırım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Transaction Lock problemi

Mesaj gönderen mrmarman »

Beklemenin sebebi tablolara gereğinden fazla index tanımlamış olmalısınız. Öyle ise, Index sayısını makul seviyeye çekin.
Resim
Resim ....Resim
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Transaction Lock problemi

Mesaj gönderen Okann »

Insert işlemi her kullanıcıda 2 dk surmuyor. mesela exceldeki sutun sayısı standart 4 stundur. ama satır sayısı kullanıcıya göre değişir.
bu kullanıcılar local değil client çalışıyor. bununda yavaşlığa etkisi var. internet hızı vs herşey etken.
10000 e kadar satır olanlar var 2 dk bu yüzden dedim. kayıt sayısı çok olunca 2 dk kadar sürebiliyor. sanırım en iyi yöntem dediğiniz gibi temp tablo kullanmak olacak.
indexde hiç yok tabloda.
ilgilenen herkese teşekkür ederim.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Transaction Lock problemi

Mesaj gönderen sabanakman »

Yazma işlemi süresini minimum seviyeye çekmek adına bir önerim olacak. Öncelikle kayıtları direkt tabloya yazmak yerine geçici (temp) tabloya yazmakta fayda var. Sürenin büyük kısmı bu geçici (her bağlantı için birbirinden bağımsız oluşan) tabloya yazarken geçecektir. İşlem sonunda ise asıl tabloya kayıtları insert sorgusu ile ekleyerek işleminizi tamamlayabilirsiniz. Tabi "transaction"ı sadece bu insert işlemi esnasında aktif etmek gerekmektedir. SQL içi insert sorguları binlerce kayıt için bile olsa çok hızlı sonuçlanacaktır ve çalışmanızı olumsuz etkilemeyecektir.

Kod: Tümünü seç

if Object_Id('tempdb..#tmp')is not null drop table #tmp -->varsa geçici tabloyu sil

-->Temp tabloyu, asıl tablonun yapısında oluşturmak gerekmektedir.
select top 0 * into #tmp from TABLO -->kayıt bulunmayan geçici tablo, asıl tablo ile aynı alanlara sahip olarak oluşur
Connection nesnesini kapatmadan Excel verilerinizi #tmp tablosuna o connection'a bağlı Table ve Query ile yazabilirsiniz ve işiniz bitince aşağıdaki gibi bir sorgu ile "transaction" başlatıp işlemi bir çırpıda bitirebilirsiniz.

Kod: Tümünü seç

insert into TABLO (Alan1, Alan2, .., AlanN)
select Alan1, Alan2, .., AlanN from #tmp
Buradaki #tmp gibi geçici tablolar bağlantı kesildiğinde kendiliğinden silinmektedirler.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: Transaction Lock problemi

Mesaj gönderen Okann »

şaban hocam çok teşekkür ederim ilgilendiğiniz için.
örneğinize uygun bir yapı kurgulamaya çalışacağım.
Cevapla