beginTransaction resume !
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
beginTransaction resume !
herkese merhabalar , canınızı çok sıkmadan kafanızı da inşallah karıştırmadan sorunumu anlatmaya çalışacağım .
Localde database işlemleri yaparken arka planda uzak servera veri aktarımı yapılıyor bu verilerin belli aralıklarla yapılması gerekiyor o yüzden gün içinde yapmak zorundayım. Sorunum şu ki local den yapılan bu işlemler için begintrans , committrans rollbacktrans komutlarını kullanıyorum herhangi bir sorun çıkar veya işlemler tamamlanmazsa diye. Ama bazen localde yapılan işlemlerle uzak serverdaki işlemler çakıştığında hataya sebeb oluyor , daha önce buna benzer sorun olabileceği ile ilgili ertan bey aslında beni uyarmıştı ama tam olarak çözüm bulamadım , bu transaction olaylarında acaba bekletme işlemi gibi bişi var mı ? mesela local de işlem yapılacağı zaman release veya pause gibi bişi yapsam da şu transaction boşa düşse ne güzel olurdu sonra yine kaldığı yerden devam etse gibi böyle birşey varmıydı acaba ? veya buna benzer bir özeliği .
herkese teşekkürler.
Localde database işlemleri yaparken arka planda uzak servera veri aktarımı yapılıyor bu verilerin belli aralıklarla yapılması gerekiyor o yüzden gün içinde yapmak zorundayım. Sorunum şu ki local den yapılan bu işlemler için begintrans , committrans rollbacktrans komutlarını kullanıyorum herhangi bir sorun çıkar veya işlemler tamamlanmazsa diye. Ama bazen localde yapılan işlemlerle uzak serverdaki işlemler çakıştığında hataya sebeb oluyor , daha önce buna benzer sorun olabileceği ile ilgili ertan bey aslında beni uyarmıştı ama tam olarak çözüm bulamadım , bu transaction olaylarında acaba bekletme işlemi gibi bişi var mı ? mesela local de işlem yapılacağı zaman release veya pause gibi bişi yapsam da şu transaction boşa düşse ne güzel olurdu sonra yine kaldığı yerden devam etse gibi böyle birşey varmıydı acaba ? veya buna benzer bir özeliği .
herkese teşekkürler.
Re: beginTransaction resume !
Şu anda "nested transaction" yani zaten bir transaction var iken başka bir tane üzerine başlatmaya çalışıyorsunuz gibi anladım.
Bunun sebebi çok yüksek ihtimal ile tek bir local database bağlantısı üzerinden bütün işlemleri yapmanız olabilir. Çözüm adına deneyebilecekleriniz;
- Mevcut local database için ikinci bir transaction bileşeni ekleyip thread içinde bu ikinci transaction bileşenini kullanabilirsiniz.
- Thread içinde yeni bir local database bağlantısı sağlayıp bu yeni database bağlantısı üzerinden yeni bir transaction başlatabilirsiniz.
Bunun sebebi çok yüksek ihtimal ile tek bir local database bağlantısı üzerinden bütün işlemleri yapmanız olabilir. Çözüm adına deneyebilecekleriniz;
- Mevcut local database için ikinci bir transaction bileşeni ekleyip thread içinde bu ikinci transaction bileşenini kullanabilirsiniz.
- Thread içinde yeni bir local database bağlantısı sağlayıp bu yeni database bağlantısı üzerinden yeni bir transaction başlatabilirsiniz.
Re: beginTransaction resume !
Oncelikle tesekkur ederim vakit ayırıp ilgilendiğiniz için .
Aslında araştirmaların sonucunda snapshot isolation diye bir şey dikkatimi çekti bu site üzerindeki formlarda da daha önce Tuğrul bey konu ile ilgili açıklamalar yapmış sanki yapmaya çalıştığım iş onunla cözülebilir gibi geldi bana ama tam olarak nasıl kullanacağımız anlayamadım konu hakkında bilginiz varsa veya örnek paylaşabilir misiniz.
https://blog.sqlauthority.com/2010/05/2 ... ion-reduce the blocking transactions/amp/
Yukarıdaki linete örnekte bir anlatım var ama henüz çözemedim açarken snapshot isalation a set edip öyle mi açmak gerekiyor yoksa ilk başta database ı bir kere ayarlayıp o şekilde mi çalışmak gerekiyor acaba
Herkese kolaylıklar vede teşekkürler
Aslında araştirmaların sonucunda snapshot isolation diye bir şey dikkatimi çekti bu site üzerindeki formlarda da daha önce Tuğrul bey konu ile ilgili açıklamalar yapmış sanki yapmaya çalıştığım iş onunla cözülebilir gibi geldi bana ama tam olarak nasıl kullanacağımız anlayamadım konu hakkında bilginiz varsa veya örnek paylaşabilir misiniz.
https://blog.sqlauthority.com/2010/05/2 ... ion-reduce the blocking transactions/amp/
Yukarıdaki linete örnekte bir anlatım var ama henüz çözemedim açarken snapshot isalation a set edip öyle mi açmak gerekiyor yoksa ilk başta database ı bir kere ayarlayıp o şekilde mi çalışmak gerekiyor acaba
Herkese kolaylıklar vede teşekkürler
Re: beginTransaction resume !
Eğer Probleminiz ;
Aktarım Sırasında Projenin Donması ise büyük ihtimal Farklı Bir Tranaction'ın Tabloyu Kilitlemesidir.
Bunun çözümünü biz sql server da Databse in Isolation levelini Snapshat isolation level yaparak çözdük.
ALTER DATABASE SQLAuthority SET ALLOW_SNAPSHOT_ISOLATION ON
Aktarım Sırasında Projenin Donması ise büyük ihtimal Farklı Bir Tranaction'ın Tabloyu Kilitlemesidir.
Bunun çözümünü biz sql server da Databse in Isolation levelini Snapshat isolation level yaparak çözdük.
ALTER DATABASE SQLAuthority SET ALLOW_SNAPSHOT_ISOLATION ON
Re: beginTransaction resume !
Teşekkürler öncelikle ;
Ama sorunum tablolarda donma veya kilitlenme değil ben aynı anda birden fazla transaction başlatmak istiyorum , Söyleki bir tarafdan normal kayıt durumları devam ederken diğer tarafdan o kayıtlar sorulanıp yeni kayıtlar oluşturuluyor , bunlar hem localde hemde uzak sunucularda yapılıyor.
yapılabilir mi çokda emin değilim ama aynı anda mesela 3 adet Begintrans başlatıp bunlardan bazılarını comiit bazılarını belkide rollback yapmam gerekecek. Tam olarak istediğim aslında bu dediğim gibi yapılabilirliğinden çok emin değilim olabiliyorsa bunu sormuştum. İnşallah anlatabilmişimdir.
Ama sorunum tablolarda donma veya kilitlenme değil ben aynı anda birden fazla transaction başlatmak istiyorum , Söyleki bir tarafdan normal kayıt durumları devam ederken diğer tarafdan o kayıtlar sorulanıp yeni kayıtlar oluşturuluyor , bunlar hem localde hemde uzak sunucularda yapılıyor.
yapılabilir mi çokda emin değilim ama aynı anda mesela 3 adet Begintrans başlatıp bunlardan bazılarını comiit bazılarını belkide rollback yapmam gerekecek. Tam olarak istediğim aslında bu dediğim gibi yapılabilirliğinden çok emin değilim olabiliyorsa bunu sormuştum. İnşallah anlatabilmişimdir.
Re: beginTransaction resume !
Tam olarak anlamamak ile birlikte kısa bir açıklama yapmaya çalışayım. Birden fazla transaction kullanabilirsiniz iç içe. Bunu çok kolay bir şekilde test edebilirsiniz. BEGIN TRANSACTION ile transaction açın, ardından SELECT @@TRANCOUNT ile değeri kontrol edin. Sonra bir kere daha aynı şeyi yapın. Transaction sayısının arttığını göreceksiniz. Ardından; COMMIT çağrımında bulunun ve Transaction sayısını bir kere daha görün. Transaction sayısının bir adet azaldığını gözlemlemeniz gerekir. Ardından bir COMMIT daha yaparsanız, açık transaction sayısı Sıfır(0)'a ulaşacaktır.
Ancak ROLLBACK için durum farklı. 100 tane de transaction başlatsanız ve tek bir ROLLBACK çağrımı yapsanız, göreceksiniz ki tüm transactionlar iptal edilecek. Ama dikkat edin, her bir session için geçerli olacak bu durum. Yani Managament Studio'da birden fazla query page açıp, bir sayfada 50 transaction başlatıp, diğer sayfada Transaction sayısını gözlemlerseniz Sıfır(0) göreceksiniz, 50 değil.
Ancak ROLLBACK için durum farklı. 100 tane de transaction başlatsanız ve tek bir ROLLBACK çağrımı yapsanız, göreceksiniz ki tüm transactionlar iptal edilecek. Ama dikkat edin, her bir session için geçerli olacak bu durum. Yani Managament Studio'da birden fazla query page açıp, bir sayfada 50 transaction başlatıp, diğer sayfada Transaction sayısını gözlemlerseniz Sıfır(0) göreceksiniz, 50 değil.
Re: beginTransaction resume !
Teşekkür ederim bilgilendirme için tugrul bey , İkinci transaction ı başlatmaya çalıştığımda daha fazla oturum başlatamazsınız mesajı veriyor neden acaba ? tam olarak mesaj şöyle : Bu oturumda daha fazla hareket başlatamazsınız ? ilk transaction açık ve herhangi bir şekilde commit veya rollback yapılmamış durumdayken tekrar farklı bir transaction başlatıyorum tam bu noktada bu hatayı veriyor .
Re: beginTransaction resume !
Anladığım kadarı ile TADOConnection nesnesi üzerinden birden fazla BeginTrans çağrımı yapmaya çalışıyorsunuz. ADO'nun Sql Server'a erişirken kullandığı OLEDB Provider maalesef nested transaction desteklemiyor. Yanlış bilmiyorsam eğer. Bu bağlamda, birden fazla transaction ihtiyacınız var ise bunu ilgili stored procedure'lerin içinde başlatabilirsiniz. Ya da biraz garip olacak ama, SQL Server'a ADOConnection üzerinden ya da ADOQuery/ADODataset ile BEGIN TRANSACTION ifadesi gönderebilirsiniz.Bay_Y yazdı: ↑27 Kas 2017 06:40 Teşekkür ederim bilgilendirme için tugrul bey , İkinci transaction ı başlatmaya çalıştığımda daha fazla oturum başlatamazsınız mesajı veriyor neden acaba ? tam olarak mesaj şöyle : Bu oturumda daha fazla hareket başlatamazsınız ? ilk transaction açık ve herhangi bir şekilde commit veya rollback yapılmamış durumdayken tekrar farklı bir transaction başlatıyorum tam bu noktada bu hatayı veriyor .
Ancak buna neden ihtiyacınız olacağı ise ikinci bir tartışma konusu. Ben her işimi stored procedure'ler içinde yaparım ve ilgili stored procedure'ler içinde transaction başlatırım. Eğer Delphi tarafında bu stored procedure'lerden birden fazlasını çağıracaksam, ya da bir stored procedure'ü birden fazla kez çağıracaksam, ADOConnection üzerinden de bir adet transaction başlatırım.
Umarım sizin senaryonuza da faydalı olacaktır yazdıklarım.
Re: beginTransaction resume !
Mevcut thread kodunuzu paylaşmanız mümkün mü?
Re: beginTransaction resume !
Öncelikle çok teşekkür ediyoruım değerli fikirlerinizi benimle paylaştığınız için , tugrul beyin dediği gibi TADOConnection nesnesi üzerinden birden fazla BeginTrans çağrımı yapmaya çalışıyorum , ama yine tugrul beyin dediği gibi bu işi stored procedure içinde halletmeyi deneyeceğim.
aslında kodlama henüz hazır değil sadece olup olmadığını denemek için bir test programı yazmıştım onun linki paylaşabilirim burdan , ama yapılacak işlemi yukarıda anlatmaya çalıştım , çok başarılı olamasam da. Clientler localde çalışacak merkeze ara ara transfer yapılacak ve ordan da bazı bilgiler clientlara geri gelecek senaryo böyle bu durumda aynı anda hem local hemde uzak database e bağlanmam gereken durumlar olacak bu durumda da iki database için transcation başlatıyorum işlemleri takip etmek için ( sadece seneryo tabi henüz ) bu sırada client üzerinde de satış yapılırsa orda da transaction başlatmak gerekeceği için sorun çıkacak haliyle. Yaptığım ufak uygulamada bu sorunlarla karşılaştığım için henüz senaryoyu çizemedim.
http://dosya.co/mq0xwg26gf2w/ornek.zip.html
Stored Procedure ile ilgili bir sorum olacak müsadenizle ,
store procedure içinde verdirilen mesajların mesela sorguda kayıt bulunamadı veya transaction rollback yapılıp iptal edildi bu ve bunun gibi mesajlar print ile SQl üzerine yazdırılabiliyor ya. bu mesajı delphi içinden nasıl alınacağı ile ilgili bilgi verebilir misiniz?
aslında kodlama henüz hazır değil sadece olup olmadığını denemek için bir test programı yazmıştım onun linki paylaşabilirim burdan , ama yapılacak işlemi yukarıda anlatmaya çalıştım , çok başarılı olamasam da. Clientler localde çalışacak merkeze ara ara transfer yapılacak ve ordan da bazı bilgiler clientlara geri gelecek senaryo böyle bu durumda aynı anda hem local hemde uzak database e bağlanmam gereken durumlar olacak bu durumda da iki database için transcation başlatıyorum işlemleri takip etmek için ( sadece seneryo tabi henüz ) bu sırada client üzerinde de satış yapılırsa orda da transaction başlatmak gerekeceği için sorun çıkacak haliyle. Yaptığım ufak uygulamada bu sorunlarla karşılaştığım için henüz senaryoyu çizemedim.
http://dosya.co/mq0xwg26gf2w/ornek.zip.html
Stored Procedure ile ilgili bir sorum olacak müsadenizle ,
store procedure içinde verdirilen mesajların mesela sorguda kayıt bulunamadı veya transaction rollback yapılıp iptal edildi bu ve bunun gibi mesajlar print ile SQl üzerine yazdırılabiliyor ya. bu mesajı delphi içinden nasıl alınacağı ile ilgili bilgi verebilir misiniz?
Re: beginTransaction resume !
Benim stored procedure yapım aşağıdaki gibi. SET NOCOUNT ON ifadesini print vb, bilgi mesajları Client tarafına aktarılmasın diye ekliyorum. Aksi durumda, TADOStoredProc nesnesi içinde bir Resultset gibi değerlendirilebiliyor. Delphi tarafına SQL tarafından hata mesajını aktarmak için RAISERROR metodunu kullanabilirsiniz. Bu sayede Delphi tarafında bir Exception oluşur. Ancak, bazı durumlarda(çok fazla iç içe nested trigger'ın devreye girmesi neticesinde) bazen Delphi tarafına bu hata ulaşamıyor. Bu nedenle TADOConnection'ın Errors koleksiyonunu da kontrol etmenizde fayda olur. Bunu yapmanın en kolay yolu, TADOStoredProc'a bir helper class ya da interposer class yazıp, ExecProc metodunu özelleştirmeniz olabilir.
Kod: Tümünü seç
ALTER PROCEDURE [dbo].[sp_Banka_Tanimlari_INSERT]
@BankaAdi VARCHAR(50),
@Adres VARCHAR(250) = NULL,
@BankaWebAdresi VARCHAR(150) = NULL,
@GenelMerkezTel VARCHAR(50) = NULL,
@Fax VARCHAR(50) = NULL,
@Aktifmi BIT = NULL
AS
SET NOCOUNT ON;
BEGIN TRANSACTION;
BEGIN TRY
INSERT INTO dbo.t_Banka_Tanimlari(
BankaAdi ,
Adres ,
BankaWebAdresi ,
GenelMerkezTel ,
Fax ,
CreateDateTime,
Aktifmi
)
SELECT
@BankaAdi ,
@Adres ,
@BankaWebAdresi ,
@GenelMerkezTel ,
@Fax ,
GETDATE(),
@Aktifmi
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
EXEC sysSaveErrors;
RETURN -1;
END CATCH
IF @@TRANCOUNT > 0 COMMIT TRANSACTION;
Re: beginTransaction resume !
Çok teşekkür ederim , çok fazla stored procedure kullanmamıştım. Genelde işlemleri delphi içinde halletiğim için ama anlıyorum ki bu işlerin stored procedure tarafında halledilmesi daha doğru ve daha hızlı olacak. Bu yüzden biraz araştırma yapıp derinlemesine inceleyeceğim , ilgi ve alakanız için tekrar çok teşekkür ediyorum sağloun varolun , Allah gönlünüze göre versin.
Re: beginTransaction resume !
Ekteki örnekte Thread kullanımına örnek ve Thread içinde işlemlerin nasıl yapılabileceğine dair fikir vermesi adına başlangıç kodlarını bulabilirsiniz.
Örnek uygulama kodları içinde kolay ayırd edilebilmesi için "//EKLENEN KODLAR BU NOKTADA BAŞLIYOR" şeklinde açıklamalar eklemeye çalıştım.
Örnek thread database bağlantısı yapmıyor. Eğer bir hatam olmadı ise doğru yerel ve uzak bağlantı ConnectionString bilgileri verilmesi halinde database bağlantıları kurulacaktır.
Thread kendi içinde bir TADOConnection kullandığı için iç içe transaction başlatmanıza gerek kalmayacaktır. Thread kendi Transaction'ını yerel ve uzak bağlantı için kendisi başlatacaktır.
Örnek uygulama kodları içinde kolay ayırd edilebilmesi için "//EKLENEN KODLAR BU NOKTADA BAŞLIYOR" şeklinde açıklamalar eklemeye çalıştım.
Örnek thread database bağlantısı yapmıyor. Eğer bir hatam olmadı ise doğru yerel ve uzak bağlantı ConnectionString bilgileri verilmesi halinde database bağlantıları kurulacaktır.
Thread kendi içinde bir TADOConnection kullandığı için iç içe transaction başlatmanıza gerek kalmayacaktır. Thread kendi Transaction'ını yerel ve uzak bağlantı için kendisi başlatacaktır.
- Dosya ekleri
-
- thread_ado.7z
- (54.38 KiB) 151 kere indirildi
Re: beginTransaction resume !
Çok teşekkürler hemen kontrol edeceğim.