PostgreSQL Transaction Kontrolleri ve Savepoint’lerin Yapısı

Herkese merhaba arkadaşlar. Bu yazımızda sizlere PostgreSQL’de transaction kontrollerini, savepoint kavramını ana hatlarıyla açıklamaya çalışacağız.

Transaction bir veri tabanının olmazsa olmaz parçalarından biridir. Sık şekilde kullanılır.

Transaction’lar, veritabanı sistemlerinde temel bir kavramdır. Birden fazla adımın tek bir yığın haline getirilerek ya hep ya hiç yaklaşımı ile gerçekleştirilmesini sağlar.

❏ PostgreSQL’de transaction BEGIN veya START TRANSACTION komutu ile başlatılır.

❏ COMMIT veya END komutu ile sonlandırılır.

❏ Değişiklikler geri alınmak istenir ise ROLLBACK komutu kullanılır.

PostgreSQL 3 farklı izolasyon seviyesini destekler,

❏ READ COMMITTED

❏ REPEATABLE READ

❏ SERIALIZABLE

Bir transaction için izolasyon düzeyi, bu transaction’ın aynı anda çalışan diğerleri tarafından üretilen hangi verileri görebileceği konusunu belirler. PostgreSQL’de transaction izolasyon düzeyi, transaction’ın ilk sorgu veya veri modifikasyon satırı (select, insert, update, delete, fetch veya copy) okunduktan sonra değiştirilmez.

READ UNCOMMITTED parametresini kabul eder, ancak READ COMMITTED olarak uygular. Dirty-read’e, COMMIT olmamış değişikliklerin okunmasına, izin vermez. READ ONLY veya READ WRITE olarak başlatılabilir. SERIALIZABLE en katı transaction izolasyon seviyesi olarak kabul edilir. Bu izolasyon seviyesinde commit edilen tüm transactionlar için seri transaction düzeyi varmış gibi davranılır; yani eş zamanlı transaction’ların uygulanması aynı anda yapılmaz, birbiri ardına sırayla gönderilmişler gibi gerçekleşir.

Transaction, daha küçük parçalara bölünerek yönetilebilir. Hata oluşması halinde yalnızca küçük bir parçasının ROLLBACK olması sağlanabilir. Hata olmasa dahi belirli bir adıma dönüş isteğe bağlı olarak yapılabilir. SAVEPOINT komutu ile transaction içerisindeki bir nokta işaretlenir, ROLLBACK TO komutu ile işaretlenen yere dönüş sağlanır. SAVEPOINT komutu ile ROLLBACK TO komutu arasında çalıştırılan komutlar geçersiz hale gelir.

Transaction sonlandırılmadan, COMMIT olabilmesi için gerekli tüm kontroller yapılarak arka plana atılır. Transaction’nın durumu diske yazılır, sunucunun kapanması halinde bu transaction COMMIT olmadığı halde kaybolmaz. Dağıtık yapılarda, birden fazla kaynak üzerinde yapılan işlemlerde kullanılabilir. İki aşamalı COMMIT için hazırlanan transaction’lar, içerisinde oluşturulan kilitleri (satır, tablo gibi) COMMIT ya da ROLLBACK olana kadar bırakmazlar.

PREPARE TRANSACTION transaction_id;

COMMIT PREPARED transaction_id;

ROLLBACK PREPARED transaction_id;

Transaction’nın snapshot’ı dışa aktarılabilir. Aynı snapshot birden fazla transaction tarafından kullanılabilir. Snapshot’ı içe aktaracak olan transactionlar, SERIALIZABLE veya REPEATABLE READ izolasyon seviyesinde olmalıdır.

SELECT pg_export_snapshot();

SET TRANSACTION SNAPSHOT snapshot_id;

PostgreSQL aslında tüm SQL cümlelerini BEGIN ve COMMIT ile kapsayarak oluşturur. Yani biz sorgunun başına BEGIN koymasak dahi postgresql bu yapıyı koyar ve sonuna COMMIT ekleyerek çalıştırır. Aşağıda BEGIN, COMMIT, SAVEPOINT ve ROLLBACK kullanılmış bir transaction örneği bulunmaktadır. A kişisi maaşından 100 lira C kişisine ödeyecektir fakat B kişisinin hesabı güncellenmiştir. ROLLBACK yapılarak bu hatadan dönülür. Ayrıca my_savepoint’ e ROLLBACK ile dönülmüştür.

BEGIN;

UPDATE maaslar SET alinan_maas = alinan_maas — 100.00

WHERE isim = ‘A’;

SAVEPOINT my_savepoint;

UPDATE maaslar SET alinan_maas = alinan_maas + 100.00

WHERE isim = ‘B’;

ROLLBACK TO my_savepoint;

UPDATE maaslar SET alinan_maas = alinan_maas + 100.00

WHERE isim = ‘C’;

COMMIT;

Yazımızdaki Kodlar ve daha fazlası sitemizde yeralmaktadır. http://latestsoftwaredevelopers.com/

Beğendiysen bir çay ısmarlayabilirsin ☕

Bana çay ısmarla

Database ile ilgili yorumlar

Yorum Paylaş

EMail Zorunlu alanlar * *