Files
api-btekno/REPEATED_UPDATE_BEHAVIOR.md

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:

  1. ON DUPLICATE KEY UPDATE hanya mengganti nilai, bukan menghapus row
  2. Primary key tetap sama, row tetap ada
  3. 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:

  1. ON DUPLICATE KEY UPDATE mengganti nilai, bukan menambah
  2. Query selalu hitung ulang dari entry_events, bukan menambah ke nilai lama
  3. 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:

  1. Biarkan cron otomatis jalan setiap jam

    • Update jam yang baru selesai
    • Tidak perlu manual intervention
  2. Manual execute hanya jika perlu:

    • Ada event terlambat yang perlu di-rekap
    • Ada masalah di cron sebelumnya
    • Testing atau debugging
  3. Rekap final kemarin (opsional):

    • Setiap hari jam 1 pagi
    • Memastikan data kemarin lengkap

Yang Salah:

  1. Jangan khawatir data hilang

    • Data tidak akan hilang, hanya nilai yang diganti
    • Row tetap ada dengan primary key yang sama
  2. Jangan takut double count

    • Tidak akan double count karena menggunakan UPDATE, bukan ADD
    • Query selalu hitung ulang dari source data
  3. 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.