DDL yayınlayan bir program üzerinde çalışıyorum. Bilmek isterim kiCREATE TABLE
DDL'nin geri alınıp alınamayacağını
- Postgres
- MySQL
- SQLite
- ve diğerleri
Her bir veritabanının DDL ile işlemleri nasıl işlediğini açıklayın.
DDL yayınlayan bir program üzerinde çalışıyorum. Bilmek isterim kiCREATE TABLE
DDL'nin geri alınıp alınamayacağını
Her bir veritabanının DDL ile işlemleri nasıl işlediğini açıklayın.
Yanıtlar:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis , PostgreSQL perspektifinden bu konuya genel bir bakış sağlar.
DDL bu belgeye göre işlem görüyor mu?
SQLite ayrıca işlemsel DDL'ye sahip görünüyor. SQLite'de ROLLBACK
bir CREATE TABLE
ifade yapabildim . Onun CREATE TABLE
dokümantasyon herhangi bir özel işlem 'FRİKİKLERİNDEN' bahsetmiyor.
ALTER TABLE
SQLite ifadesi de geri alınabilir. Dokümantasyonda açıkça belirtilmemiştir . Orada bahsedilen, bir işlem içinde "gelişmiş" değişikliklerin nasıl gerçekleştirileceğidir.
PostgreSQL, çoğu veritabanı nesnesi için işlemsel DDL'ye sahiptir (kesinlikle tablolar, indeksler, ancak veritabanları, kullanıcılar değil). Bununla birlikte, pratik olarak herhangi bir DDL ACCESS EXCLUSIVE
, hedef nesnede bir kilitlenecek ve DDL işlemi bitene kadar onu tamamen erişilemez hale getirecektir . Ayrıca, tüm durumlar tam olarak ele alınmaz - örneğin, foo
başka bir işlem onu bırakıp bir değiştirme tablosu oluştururken tablodan seçim yapmaya çalışırsanız foo
, bloke edilen işlem sonunda yeni foo
tabloyu bulmak yerine bir hata alır . (Düzenleme: Bu, PostgreSQL 9.3'te veya öncesinde düzeltildi)
CREATE INDEX ... CONCURRENTLY
istisnai bir durumdur, eşzamanlı güncellemelere izin verirken bir tabloya bir dizin eklemek için üç işlem kullanır, bu nedenle bir işlemde kendi başına gerçekleştirilemez.
Ayrıca veritabanı bakım komutu VACUUM
bir işlemde kullanılamaz.
foo
Başka bir işlem düşerken ve onu yeniden oluştururken tablodan seçim yapmaya çalışırsam , eski sürüm veya hata ile bir OK olduğumu iddia ediyorum. Yeni sürümle tamam değilim, çünkü henüz işlenmedi, bu yüzden görmemeliyim. Bir hata ile sorunum yok, çünkü eşzamanlı işlem erişiminde işlemlerin yine de yeniden başlatılması için hazırlık yapılması gerekiyor. Hatalar gerekenden daha sık meydana gelirse performansı düşürebilir, ancak yine de doğrudur.
Kesin olarak bir "geri alma" anlamına gelmese de, Oracle'da FLASHBACK komutu, veritabanı onu destekleyecek şekilde yapılandırılmışsa, bu tür değişiklikleri geri almak için kullanılabilir.
Görünüşe göre diğer cevaplar oldukça güncel değil.
2019 itibariyle:
START TRANSACTION ... COMMIT;
, aynı işlemdeki sonuncusu başarısız olursa, bir işlemdeki DDL ifadelerini yine de geri alamazsınız. ( Dev. mysql.com/doc/refman/8.0/en/… )
MySQL ile yapılamaz görünüyor, çok aptalca, ama doğru ... (kabul edilen cevaba göre)
"InnoDB'deki CREATE TABLE ifadesi tek bir işlem olarak işlenir. Bu, kullanıcıdan gelen bir ROLLBACK'in bu işlem sırasında kullanıcının yaptığı CREATE TABLE ifadelerini geri almadığı anlamına gelir."
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Birkaç farklı yol denedim ve geri dönmeyecek ..
Çözüm, basitçe bir hata bayrağı ayarlamak ve sorgulardan biri başarısız olursa "tblname tablosunu bırak" yapmaktır.