3 poin oleh GN⁺ 2023-12-20 | 1 komentar | Bagikan ke WhatsApp

Latar belakang MySQL

  • MySQL adalah salah satu basis data SQL yang paling luas digunakan selama 28 tahun terakhir.
  • Utamanya digunakan untuk pemrosesan transaksi online (OLTP), dan juga diterapkan sebagai bagian dari sistem OLAP serta antrean.
  • Dirancang sebagai basis data server tunggal, tetapi diperluas melalui berbagai metode replikasi multi-node.
  • Analisis ini berfokus pada MySQL yang menggunakan storage engine InnoDB.

Tingkat isolasi ANSI SQL sebenarnya buruk

  • Untuk membahas seluk-beluk tingkat isolasi SQL, perlu dijelaskan latar belakang historis empat tingkat keamanan konsistensi transaksi yang diusulkan pada 1977 dan standar SQL yang diterbitkan ANSI pada 1986.
  • ANSI SQL mendefinisikan tingkat isolasi melalui tiga fenomena yang mungkin terjadi (dirty read, non-repeatable read, phantom).
  • Pada 1995, kelemahan tingkat isolasi ANSI SQL mulai disorot, dan pada 1999 Adya mengembangkan definisi formal serta independen dari implementasi untuk tingkat isolasi ANSI SQL.

Tingkat isolasi MySQL

  • Dokumentasi MySQL menyatakan bahwa ia menyediakan empat tingkat isolasi transaksi yang dijelaskan oleh standar SQL:1992.
  • Penjelasan tentang bagaimana MySQL mencapai masing-masing tingkat isolasi juga disertakan.
  • Tingkat isolasi Repeatable Read di MySQL menjamin keamanan melalui mekanisme snapshot.

Desain pengujian

  • Merancang test suite untuk MySQL menggunakan pustaka pengujian Jepsen.
  • Pengujian dilakukan di berbagai lingkungan, termasuk node MySQL tunggal, klaster replikasi binlog, dan klaster AWS RDS.
  • Menjalankan workload utama untuk isolasi transaksi menggunakan pemeriksa list-append dari Elle.

Hasil

  • Repeatable Read di MySQL mengizinkan G2-item, yang dilarang oleh tingkat isolasi PL-2.99 milik Adya.
  • Repeatable Read di MySQL juga mengizinkan G-single (read skew).
  • Repeatable Read di MySQL mengizinkan fenomena P4 (lost update).
  • Repeatable Read di MySQL menunjukkan kesalahan konsistensi internal.
  • Repeatable Read di MySQL melanggar Monotonic Atomic View.

Pendapat GN⁺

  • Fakta bahwa tingkat isolasi Repeatable Read di MySQL menunjukkan perilaku yang berbeda dari yang dinyatakan dalam standar merupakan informasi penting bagi pengembang dan administrator basis data. Ini berarti bahwa ekspektasi terhadap konsistensi dan isolasi data mungkin tidak terpenuhi.
  • Hasil pengujian memberikan informasi penting untuk memahami tingkat isolasi sistem basis data dan memilih mekanisme isolasi yang tepat.
  • Temuan ini memberikan wawasan tentang bagaimana standar terkait tingkat isolasi basis data dapat berbeda dari implementasi nyata. Ini membantu memahami kompleksitas teknologi basis data dan perbedaan halus dalam tingkat isolasi.

1 komentar

 
GN⁺ 2023-12-20
Komentar Hacker News
  • Sudah lama berpendapat bahwa "repeatable read" adalah ide yang buruk. Bahkan jika implementasinya sempurna dan bekerja benar di database, level ini sulit dipahami saat menangani kueri yang kompleks.

    • Menurut saya hanya ada dua level isolasi yang masuk akal:
      • read committed
      • serializable
    • Pengaturan serializable tidak menimbulkan hal-hal tak terduga. Di sisi read committed, jelas bahwa jika ingin tampilan data yang konsisten, Anda harus mengunci baris sebelum mulai membacanya.
    • read committed sangat mirip dengan kode multithread umum dan manajemen memori, sehingga sebagian besar engineer bisa memahaminya secara intuitif.
    • serializable sangat ketat sehingga sulit melakukan kesalahan tak terduga.
    • Level di tengah adalah wilayah tak bertuan, dan apa pun yang kurang konsisten daripada Read Committed bukan lagi database.
  • Akan ada presentasi berjudul "Isolation Levels and MVCC in SQL Databases: A Technical Comparative Study" di FOSSDEM-2024.

    • Studi perbandingan Oracle, MySQL, SQL Server, PostgreSQL, dan YugabyteDB.
  • Sedang menilai tulisan tentang AWS RDS, tetapi penasaran apakah ada fokus pada AWS Aurora (MySQL). AWS membangun platform database yang berpura-pura menjadi MySQL atau PostgreSQL. Akan menarik melihat apakah Aurora MySQL memiliki "fitur" seperti RDS atau MariaDB.

  • Menurut saya ini contoh yang sangat bagus tentang "sistem yang benar-benar bekerja" yang dibangun di atas fondasi yang menunjukkan banyak artefak konsistensi.

  • Agak mengkhawatirkan bahwa replikasi RDS berhenti bekerja dalam 5 menit dan tidak ada notifikasi kegagalan health check.

  • Penasaran bagaimana append (a) dipetakan ke operasi SQL nyata pada tabel yang diberikan, dan apakah field TEXT digunakan sebagai list.

    • Ada masalah di mode repeatable read MySQL di mana satu SELECT memilih satu baris lalu mengembalikan hasil yang mustahil. Misalnya, pada SELECT min(value), max(value) FROM table WHERE id = 1;, dengan id sebagai primary key, saya pernah mendapatkan nilai yang berbeda untuk min dan max.
  • Akan membantu jika ada perbandingan bukan hanya dengan definisi teoretis mode isolasi, tetapi juga dengan database relasional populer lain seperti PostgreSQL, MS SQL, dan Oracle. Ini hal yang perlu diingat developer saat ingin memastikan kompatibilitas.

  • Sepertinya "SELECT ... FOR UPDATE" adalah jawaban untuk semua masalah ini; jika Anda mengunci baris yang akan diperbarui, semuanya bekerja seperti yang dijanjikan.

  • Hari ini saya tadinya ingin menyelesaikan beberapa pekerjaan, tetapi terima kasih karena 'call me maybe' dari aphyr dan jepsen.io adalah sebagian dari konten terbaik yang pernah saya baca di internet.

  • Penasaran seberapa banyak dari analisis MySQL ini yang juga berlaku untuk MariaDB yang menggunakan InnoDB sebagai storage engine bawaan.