Langsung ke konten
AFM Studio
  • Halaman

    AFM Studio
  • Karya
  • Lab
  • Tentang
  • CV
  • Kontak
  • Proyek

    AksaraPerpustakaan pengetahuan Otorita IKN yang bisa dicari, dengan server memeriksa akses setiap pembaca di tiga tingkat
  • Daily TaqwaSistem presensi salat anti-manipulasi untuk ~2.000 pegawai OIKN di Masjid Negara IKN
  • Lantara v2Mesin perizinan Otorita IKN tempat administrator menambah jenis izin baru dari layar, tanpa developer
  • eKiosk IKNDua ruang kendali untuk Nusantara: konten kios dan pelacakan bus live dengan estimasi kedatangan yang menilai dirinya sendiri
  • E-Monev IKNPlatform pemantauan pembangunan Nusantara selama 23 tahun, melacak progres triwulan setiap unit terhadap 24 KPI
  • JDIH OIKNPortal dokumen hukum publik OIKN, dengan alur penerbitan terkendali dan ringkasan AI yang tidak pernah keluar dari server
  • Jejak PenanamanAplikasi absen acara penanaman pohon IKN yang membuktikan peserta hadir di lokasi lewat selfie ber-geofence
  • Dashboard SAKTIPipeline malam dan dashboard yang menggantikan unduhan anggaran manual di keenam satker OIKN
  • DoseRxKalkulator dosis untuk 127 obat yang membulatkan dosis ke tablet dan sirup yang dijual apotek Indonesia
  • CubiqPelatih speedcubing dengan timer setara kompetisi dan solver buatan sendiri untuk 8 puzzle utama
  • ScimotionPerpustakaan sains interaktif berisi 86 artikel, masing-masing dijelaskan bersama animasi yang bisa dikendalikan pembaca
  • WA Daily Scrum BotBot WhatsApp yang menagih laporan standup tim 14 orang dan menandai tugas yang macet berhari-hari

↑ ↓ untuk berpindah · Enter untuk membuka · Esc untuk menutup

Isolation Anomaly

Partitur interaktif dua transaksi database yang saling bentrok, dicek terhadap 220 rekaman dari empat database asli

Tangkapan layar
mesin database dimodelkan dari dokumentasi
5
eksekusi direkam di database asli
220
skenario, termasuk write skew
11
kutipan dokumentasi vendor di balik aturan
328
Di halaman ini

Masalahnya

Setiap developer aplikasi memilih isolation level database, pengaturan yang menentukan seberapa jauh dua operasi yang berjalan bersamaan boleh saling mengganggu. Hampir semua orang memakai nilai bawaan, dan hampir tidak ada yang bisa menjelaskan dari apa pengaturan itu melindungi mereka. Jenis kegagalannya diajarkan sebagai daftar nama, dirty read, non-repeatable read, phantom, yang dihafal untuk wawancara kerja tapi jarang dipahami.

Kegagalan yang paling berbahaya justru tidak ada di daftar itu. Pada write skew, dua transaksi membaca data yang sama, masing-masing mengecek aturan ("masih ada orang lain yang piket, jadi saya boleh berhenti piket"), lalu masing-masing menulis baris yang berbeda. Tidak ada yang bertabrakan, keduanya berhasil disimpan, dan aturannya dilanggar. Begitulah jadwal piket bisa kosong dan ruangan terpesan dua kali. Snapshot isolation tidak mencegahnya, padahal itulah yang sebenarnya dipakai kebanyakan pengaturan bawaan. Lebih parah lagi, nama level yang sama punya arti berbeda di tiap database. "SERIALIZABLE" di Oracle tetap membiarkan write skew.

Yang saya bangun

Database asli dijalankan lebih dulu

Developer bisa saja mengambil keputusan produksi dari apa yang ditampilkan alat ini, jadi simulatornya tidak boleh dibangun dari dugaan saya tentang database. Sebelum simulatornya ada, saya menulis harness yang menjalankan PostgreSQL, MySQL, SQL Server, dan Oracle asli di container, lalu memutar setiap jadwal di sana. Harness mencatat setiap nilai yang dibaca, setiap kode error, di mana transaksi menunggu, dan apakah transaksi itu berhasil. Ke-220 rekaman itu menjadi kunci jawaban. Kalau simulator dan rekaman berbeda, simulatornya yang salah.

Satu mesin, lima berkas aturan

Simulatornya hanya satu. Setiap database berupa berkas aturan: arti sebenarnya dari tiap nama level, kapan lock diambil, apa yang bentrok, dan kode error apa yang muncul. Perbandingan antar-database baru adil kalau mesinnya sama, dan pakar database bisa memeriksa berkas aturan tanpa membaca kode saya. Setiap aturan mengutip dokumentasi vendor, dan deploy gagal kalau ada kutipan yang hilang.

Pemeriksa terpisah yang menyebut anomalinya

Kode yang mendeteksi anomali tidak berbagi kode apa pun dengan simulator. Ia membaca hasil eksekusi yang sudah selesai dan mencocokkan setiap anomali dengan definisi yang dipublikasikan. Pemeriksa yang dibangun di atas asumsi simulator akan ikut membenarkan bug simulator. Setiap skenario dites dua arah: anomali wajib muncul di level yang mengizinkannya, dan wajib tidak muncul di level yang mencegahnya.

Alat ini menolak kalau tidak tahu jawabannya

SQL Server memilih transaksi yang dikorbankan saat deadlock berdasarkan perkiraan biaya, jadi jadwal yang sama bisa kehilangan transaksi berbeda di level berbeda. Saya tidak menebak. Aturan itu ditandai belum dimodelkan, dan alat ini menolak menjalankannya sambil menjelaskan alasannya. Sebuah tes memastikan setiap penolakan sesuai dengan deadlock nyata di rekaman. Harness itu juga menangkap satu aturan deadlock yang saya tulis keliru, dan itulah alasan saya membangunnya lebih dulu.

Jadwal dibaca seperti partitur

Transaksi digambar di garis paranada yang sejajar, seperti partitur musik, dengan garis birama di setiap langkah. Membaca lurus ke bawah satu garis birama menunjukkan apa yang terjadi pada saat yang sama. Operasi bisa diseret untuk mengubah urutannya, dan hasilnya langsung diperbarui. Satu tanda merah muncul tepat di langkah ketika anomali tidak lagi bisa dihindari, dengan penjelasan satu kalimat yang dibentuk dari hasil eksekusi. Sebuah matriks menjalankan jadwal yang sama di kelima berkas aturan, di setiap level.

Hasilnya

Isolation Anomaly sudah live dan terbuka untuk umum, dalam bahasa Inggris dan Indonesia, sebagai situs statis penuh. Ada lima mesin yang dimodelkan: PostgreSQL 16, MySQL 8.4, SQL Server 2022, SQL Server 2022 dengan snapshot read aktif, dan Oracle 23ai. Sebelas skenario menunjukkan taruhannya, misalnya jadwal piket untuk write skew dan transfer bank untuk read skew. Anda juga bisa menyusun jadwal sendiri dan membagikannya lewat tautan. Saya membangunnya sendiri dalam dua hari pada Agustus 2026.

Di balik layarDetail teknis untuk engineer
  • Harness oracle berjalan dari docker-compose.oracle.yml dengan driver pg, mysql2, mssql, dan oracledb. Tidak satu pun masuk ke CI atau bundle browser. Merekam ulang menghasilkan fixture yang identik sampai ke byte.
  • Status menunggu dibaca dari instrumentasi tiap mesin: pg_stat_activity, performance_schema.data_lock_waits, sys.dm_exec_requests, dan v$session.blocking_session.
  • Versi yang direkam: PostgreSQL 16.14, MySQL 8.4.11 (InnoDB), SQL Server 16.0.4265.3, Oracle 23.26.2.0.0. SQL Server berjalan lewat emulasi x86 di Apple Silicon.
  • Pack: postgres-16, mysql-8-innodb, sqlserver-2022, sqlserver-2022-rcsi, oracle-23ai, divalidasi dengan Zod dan memuat 328 kutipan dokumentasi vendor. Tidak ada if (engine === 'postgres') di mana pun. RCSI menjadi pack tersendiri, direkam di database terpisah supaya opsinya tidak bocor.
  • Batas yang dinyatakan: pemilihan korban deadlock SQL Server bertanda unmodelled (lima rekaman ditolak); PostgreSQL menolak statement setelah rollback dengan 25P02, sedangkan SQL Server meng-autocommit-nya, sehingga 3960 yang tertelan tetap menulis data; di Oracle, serialization failure hanya membatalkan statement, bukan transaksi; lock wait timeout tidak dimodelkan.
  • Satu inti MVCC dengan version chain dan visibilitas snapshot, serta satu lock manager dengan range lock dan gap lock. Trace identik sampai ke byte untuk input yang sama: tanpa jam, angka acak, atau state di level modul.
  • Deteksi siklus di conflict graph dicek silang dengan enumerasi brute-force semua urutan serial, termasuk jadwal tiga transaksi.
  • 1.551 tes di 11 berkas, sekitar 3,6 detik. Sebanyak 1.215 membandingkan simulator dengan rekaman database asli; 229 adalah asersi anomali dua arah.
  • Empat dependensi runtime: Next.js 14.2.15 (output: 'export'), React 18.3.1, React DOM, dan Zod 3.23.8. Tanpa library database, parser SQL, tata letak graf, atau state. Enam halaman per bahasa; jadwal dibagikan lewat hash URL.
  • Di PRD namanya Sekat. Cakupan lima pack melampaui batas tiga pack di PRD.
  • 38 commit pada 6–7 Agustus 2026, 9.255 baris kode aplikasi dan 1.701 baris tes.

Tangkapan layar

Overview
Schedule
Scenarios
Matrix
Conflict Graph
Engines

Sedang merekrut, atau membangun hal serupa?

Saya terbuka untuk posisi full-time dan proyek freelance tertentu.