DDL yayınlayan bir program üzerinde çalışıyorum. Bilmek isterim kiCREATE TABLEDDL'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 TABLEDDL'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 ROLLBACKbir CREATE TABLEifade yapabildim . Onun CREATE TABLEdokümantasyon herhangi bir özel işlem 'FRİKİKLERİNDEN' bahsetmiyor.
ALTER TABLESQLite 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, foobaş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 footabloyu 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 VACUUMbir işlemde kullanılamaz.
fooBaş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.