6.2 KiB
Behavior Update Berulang di Hourly Summary
Jawaban Singkat
YA, ketika cron hourly jalan lagi, data akan di-UPDATE lagi.
Ini adalah behavior yang benar dan diinginkan untuk memastikan data selalu akurat.
Timeline Update Berulang
Skenario: Manual Execute + Cron Otomatis
Jam 14:00 - Manual execute:
php bin/hourly_summary.php today 13
- ✅ Update data jam 13:00
- ✅ Data jam 13:00 sekarang sesuai dengan entry_events
Jam 15:00 - Cron otomatis jalan:
# Cron command:
php bin/hourly_summary.php today 14
- ✅ Update data jam 14:00 (jam yang baru selesai)
- ✅ Data jam 13:00 TIDAK diubah (karena tidak di-rekap)
Jam 16:00 - Cron otomatis jalan lagi:
# Cron command:
php bin/hourly_summary.php today 15
- ✅ Update data jam 15:00 (jam yang baru selesai)
- ✅ Data jam 13:00 dan 14:00 TIDAK diubah
Skenario: Cron Update Jam yang Sama Berulang
Jam 15:00 - Cron pertama kali:
php bin/hourly_summary.php today 14
- ✅ Update data jam 14:00
- ✅ total_count: 10, total_amount: 20000
Jam 15:30 - Ada event baru masuk (terlambat):
- Event jam 14:00 masuk di jam 15:30 (terlambat)
- entry_events sekarang punya 11 events untuk jam 14:00
Jam 16:00 - Cron jalan lagi (jika rekap ulang jam 14):
# Jika manual execute lagi:
php bin/hourly_summary.php today 14
- ✅ UPDATE LAGI data jam 14:00
- ✅ total_count: 10 → 11 (DIGANTI dengan nilai baru)
- ✅ total_amount: 20000 → 22000 (DIGANTI dengan nilai baru)
- ✅ Event terlambat sekarang terhitung
Mengapa Update Berulang Itu Baik?
1. Akurasi Data
- Data summary selalu mencerminkan data aktual di
entry_events - Jika ada event terlambat, akan otomatis terhitung saat rekap ulang
2. Idempotent
- Bisa dijalankan berulang tanpa merusak data
- Hasil selalu sama, tidak peduli berapa kali dijalankan
- Tidak akan double count karena menggunakan
ON DUPLICATE KEY UPDATE
3. Self-Healing
- Jika ada masalah di cron sebelumnya, bisa di-rekap ulang
- Tidak perlu manual correction
Contoh Timeline Lengkap
Hari: 2025-12-17
Jam 14:00 - Manual execute:
php bin/hourly_summary.php today 13
- ✅ Update jam 13:00
- ✅ total_count: 5, total_amount: 10000
Jam 15:00 - Cron otomatis:
# Cron command otomatis:
php bin/hourly_summary.php today 14
- ✅ Update jam 14:00 (jam yang baru selesai)
- ✅ Jam 13:00 TIDAK diubah (karena tidak di-rekap)
Jam 15:30 - Event terlambat masuk:
- Event jam 13:00 masuk di jam 15:30 (terlambat)
- entry_events sekarang punya 6 events untuk jam 13:00
Jam 16:00 - Cron otomatis:
# Cron command otomatis:
php bin/hourly_summary.php today 15
- ✅ Update jam 15:00 (jam yang baru selesai)
- ✅ Jam 13:00 MASIH total_count: 5 (belum ter-update)
Jam 16:30 - Manual execute lagi untuk jam 13:
php bin/hourly_summary.php today 13
- ✅ UPDATE LAGI jam 13:00
- ✅ total_count: 5 → 6 (DIGANTI dengan nilai baru)
- ✅ total_amount: 10000 → 12000 (DIGANTI dengan nilai baru)
- ✅ Event terlambat sekarang terhitung
Apakah Data Akan Hilang?
TIDAK, data tidak akan hilang karena:
- ON DUPLICATE KEY UPDATE hanya mengganti nilai, bukan menghapus row
- Primary key tetap sama, row tetap ada
- Hanya nilai (total_count, total_amount) yang diganti
Contoh:
Sebelum update:
summary_date: 2025-12-17
summary_hour: 13
location_code: kerkof_01
gate_code: gate01
category: motor
total_count: 5
total_amount: 10000
Setelah update:
summary_date: 2025-12-17 ← SAMA
summary_hour: 13 ← SAMA
location_code: kerkof_01 ← SAMA
gate_code: gate01 ← SAMA
category: motor ← SAMA
total_count: 6 ← DIGANTI (5 → 6)
total_amount: 12000 ← DIGANTI (10000 → 12000)
Row tetap ada, hanya nilainya yang berubah.
Apakah Akan Double Count?
TIDAK, tidak akan double count karena:
- ON DUPLICATE KEY UPDATE mengganti nilai, bukan menambah
- Query selalu hitung ulang dari
entry_events, bukan menambah ke nilai lama - Setiap kali rekap, hasilnya selalu sama (idempotent)
Contoh:
Skenario salah (jika ditambah):
total_count lama: 5
total_count baru: 6
total_count hasil: 5 + 6 = 11 ❌ SALAH
Skenario benar (diganti):
total_count lama: 5
total_count baru: 6
total_count hasil: 6 ✅ BENAR (diganti, bukan ditambah)
Kapan Data Akan Di-Update Lagi?
1. Cron Otomatis Setiap Jam
- Update jam yang baru saja selesai
- Contoh: jam 15:00 update jam 14:00
- Jam sebelumnya TIDAK diubah
2. Manual Execute
- Update jam yang ditentukan
- Bisa update jam berapa saja, kapan saja
- Berguna untuk rekap ulang atau fix data
3. Rekap Final Kemarin
- Setiap hari jam 1 pagi
- Rekap semua jam kemarin
- Memastikan data kemarin lengkap
Best Practice
✅ Yang Benar:
-
Biarkan cron otomatis jalan setiap jam
- Update jam yang baru selesai
- Tidak perlu manual intervention
-
Manual execute hanya jika perlu:
- Ada event terlambat yang perlu di-rekap
- Ada masalah di cron sebelumnya
- Testing atau debugging
-
Rekap final kemarin (opsional):
- Setiap hari jam 1 pagi
- Memastikan data kemarin lengkap
❌ Yang Salah:
-
Jangan khawatir data hilang
- Data tidak akan hilang, hanya nilai yang diganti
- Row tetap ada dengan primary key yang sama
-
Jangan takut double count
- Tidak akan double count karena menggunakan UPDATE, bukan ADD
- Query selalu hitung ulang dari source data
-
Jangan manual execute terlalu sering
- Biarkan cron otomatis bekerja
- Manual execute hanya jika benar-benar perlu
Kesimpulan
| Aspek | Behavior |
|---|---|
| Apakah akan di-update lagi? | ✅ YA, setiap kali cron jalan atau manual execute |
| Apakah data akan hilang? | ❌ TIDAK, row tetap ada, hanya nilai yang diganti |
| Apakah akan double count? | ❌ TIDAK, menggunakan UPDATE bukan ADD |
| Apakah ini normal? | ✅ YA, ini behavior yang benar dan diinginkan |
| Kapan akan di-update? | Setiap jam (cron otomatis) atau manual execute |
Intinya: Update berulang adalah normal dan benar. Ini memastikan data summary selalu akurat dan sesuai dengan entry_events.