Add explanation: hourly summary will be updated again when cron runs (repeated updates behavior)
This commit is contained in:
231
REPEATED_UPDATE_BEHAVIOR.md
Normal file
231
REPEATED_UPDATE_BEHAVIOR.md
Normal file
@@ -0,0 +1,231 @@
|
|||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
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:**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
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):**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
php bin/hourly_summary.php today 13
|
||||||
|
```
|
||||||
|
- ✅ Update jam 13:00
|
||||||
|
- ✅ total_count: 5, total_amount: 10000
|
||||||
|
|
||||||
|
**Jam 15:00 - Cron otomatis:**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
# 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:**
|
||||||
|
```bash
|
||||||
|
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`.
|
||||||
|
|
||||||
Reference in New Issue
Block a user