Saya sedang mengerjakan program yang mengeluarkan DDL. Saya ingin tahu apakah CREATE TABLE
DDL serupa dan dapat diputar kembali
- Postgres
- MySQL
- SQLite
- dkk
Jelaskan bagaimana setiap database menangani transaksi dengan DDL.
sql
transactions
ddl
create-table
joeforker
sumber
sumber
Jawaban:
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis memberikan gambaran umum tentang masalah ini dari perspektif PostgreSQL.
Apakah DDL transaksional menurut dokumen ini?
SQLite juga tampaknya memiliki DDL transaksional juga. Saya bisa
ROLLBACK
membuatCREATE TABLE
pernyataan di SQLite. ItsCREATE TABLE
dokumentasi tidak menyebutkan khusus setiap transaksional 'Gotchas'.sumber
ALTER TABLE
Pernyataan SQLite yang agak terbatas juga dapat dibatalkan. Itu tidak disebutkan secara eksplisit dalam dokumentasi . Apa yang disebutkan di sana adalah bagaimana melakukan perubahan "lanjutan" di dalam transaksi.PostgreSQL memiliki DDL transaksional untuk sebagian besar objek database (tentu saja tabel, indeks, dll, tetapi tidak untuk database, pengguna). Namun secara praktis setiap DDL akan mendapatkan
ACCESS EXCLUSIVE
kunci pada objek target, membuatnya benar-benar tidak dapat diakses hingga transaksi DDL selesai. Selain itu, tidak semua situasi ditangani dengan baik - misalnya, jika Anda mencoba memilih dari tabelfoo
sementara transaksi lain menghapusnya dan membuat tabel penggantifoo
, maka transaksi yang diblokir akhirnya akan menerima kesalahan daripada menemukanfoo
tabel baru . (Sunting: ini telah diperbaiki di atau sebelum PostgreSQL 9.3)CREATE INDEX ... CONCURRENTLY
luar biasa, ia menggunakan tiga transaksi untuk menambahkan indeks ke tabel sambil mengizinkan pembaruan bersamaan, jadi itu sendiri tidak dapat dilakukan dalam transaksi.Juga perintah pemeliharaan database
VACUUM
tidak dapat digunakan dalam transaksi.sumber
foo
sementara transaksi lain turun dan membuatnya kembali, maka saya setuju dengan versi lama atau kesalahan. Saya tidak setuju dengan versi baru, karena itu belum dilakukan, jadi saya tidak boleh melihatnya. Saya baik-baik saja dengan kesalahan, karena dalam akses transaksional bersamaan seseorang harus tetap siap untuk memulai kembali transaksi. Jika kesalahan terjadi lebih sering dari yang diperlukan, hal itu dapat menurunkan kinerja, tetapi itu masih benar.Meskipun tidak secara tegas disebut sebagai "rollback", di Oracle, perintah FLASHBACK dapat digunakan untuk membatalkan jenis perubahan ini, jika database telah dikonfigurasi untuk mendukungnya.
sumber
Sepertinya jawaban lainnya sudah cukup usang.
Per 2019:
sumber
START TRANSACTION ... COMMIT;
. Jadi, Anda masih tidak dapat mengembalikan pernyataan DDL dalam transaksi jika yang terakhir dalam transaksi yang sama gagal. (Lihat catatan di bawah dev. mysql.com/doc/refman/8.0/en/… )Sepertinya tidak dapat dilakukan dengan MySQL , sangat bodoh, tapi benar ... (sesuai jawaban yang diterima)
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Mencoba beberapa cara berbeda dan tidak akan mundur ..
Mengatasinya adalah dengan hanya menetapkan tanda kegagalan dan melakukan "drop table tblname" jika salah satu query gagal ..
sumber