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.
Saya sedang mengerjakan program yang mengeluarkan DDL. Saya ingin tahu apakah CREATE TABLE
DDL serupa dan dapat diputar kembali
Jelaskan bagaimana setiap database menangani transaksi dengan DDL.
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
membuat CREATE TABLE
pernyataan di SQLite. Its CREATE TABLE
dokumentasi tidak menyebutkan khusus setiap transaksional 'Gotchas'.
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 tabel foo
sementara transaksi lain menghapusnya dan membuat tabel pengganti foo
, maka transaksi yang diblokir akhirnya akan menerima kesalahan daripada menemukan foo
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.
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.
Sepertinya jawaban lainnya sudah cukup usang.
Per 2019:
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)
"Pernyataan CREATE TABLE di InnoDB diproses sebagai transaksi tunggal. Ini berarti ROLLBACK dari pengguna tidak membatalkan pernyataan CREATE TABLE yang dibuat pengguna selama transaksi itu."
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 ..