Transaction Lock problemi
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.
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.
Transaction Lock problemi
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.
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.
- barisatalay
- Üye
- Mesajlar: 398
- Kayıt: 02 Nis 2013 05:43
- İletişim:
Re: Transaction Lock problemi
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.
Yeni bloğum: http://brsatalay.blogspot.com.tr/
Re: Transaction Lock problemi
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.
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.
- 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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Transaction Lock problemi
Ş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.
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.
Re: Transaction Lock problemi
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.
biri transaction açtığı zaman diğer kullanıcı açamıyor. ve program hataya düşüyor.
Re: Transaction Lock problemi
Ö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.
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.
Re: Transaction Lock problemi
Beklemenin sebebi tablolara gereğinden fazla index tanımlamış olmalısınız. Öyle ise, Index sayısını makul seviyeye çekin.
Re: Transaction Lock problemi
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.
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.
- 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
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.
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.
Buradaki #tmp gibi geçici tablolar bağlantı kesildiğinde kendiliğinden silinmektedirler.
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
Kod: Tümünü seç
insert into TABLO (Alan1, Alan2, .., AlanN)
select Alan1, Alan2, .., AlanN from #tmp
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Transaction Lock problemi
şaban hocam çok teşekkür ederim ilgilendiğiniz için.
örneğinize uygun bir yapı kurgulamaya çalışacağım.
örneğinize uygun bir yapı kurgulamaya çalışacağım.