beginTransaction resume !

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

beginTransaction resume !

Mesaj gönderen Bay_Y » 25 Kas 2017 11:53

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.

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: beginTransaction resume !

Mesaj gönderen ertank » 25 Kas 2017 01:15

Ş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.

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 26 Kas 2017 10:23

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

emrahgs
Üye
Mesajlar: 107
Kayıt: 08 Tem 2008 05:25
Konum: Antalya

Re: beginTransaction resume !

Mesaj gönderen emrahgs » 27 Kas 2017 01:43

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

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 27 Kas 2017 04:29

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.

thelvaci
Kıdemli Üye
Mesajlar: 756
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul
İletişim:

Re: beginTransaction resume !

Mesaj gönderen thelvaci » 27 Kas 2017 04:50

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.

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 27 Kas 2017 05: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 .

thelvaci
Kıdemli Üye
Mesajlar: 756
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul
İletişim:

Re: beginTransaction resume !

Mesaj gönderen thelvaci » 28 Kas 2017 09:59

Bay_Y yazdı:
27 Kas 2017 05: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 .
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.

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.

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: beginTransaction resume !

Mesaj gönderen ertank » 28 Kas 2017 11:25

Mevcut thread kodunuzu paylaşmanız mümkün mü?

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 28 Kas 2017 11:52

Ö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?

thelvaci
Kıdemli Üye
Mesajlar: 756
Kayıt: 11 Tem 2010 06:17
Konum: Istanbul
İletişim:

Re: beginTransaction resume !

Mesaj gönderen thelvaci » 28 Kas 2017 04:18

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;

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 28 Kas 2017 05:59

Ç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.

ertank
Üye
Mesajlar: 964
Kayıt: 11 Eyl 2015 11:45

Re: beginTransaction resume !

Mesaj gönderen ertank » 28 Kas 2017 11:01

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.
Dosya ekleri
thread_ado.7z
(54.6 KiB) 13 kere indirildi

Bay_Y
Üye
Mesajlar: 87
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: beginTransaction resume !

Mesaj gönderen Bay_Y » 10 Ara 2017 12:23

Çok teşekkürler hemen kontrol edeceğim.

Cevapla