Part 16 · Capstone & Mock Interview

15 tình huống phỏng vấn Banking Java/AWS

Trả lời theo invariant → timeline → transaction boundary → failure handling → evidence/metric; không chỉ gọi tên annotation hoặc AWS service.

1. Client timeout nhưng DB có thể đã commit?
Timeout là unknown outcome. Dùng idempotency key durable, trả/query transfer ID và reconciliation; không tự tạo transfer mới.
2. saveAndFlush() đã phát INSERT rồi method throw?
Flush không phải commit; exception phù hợp làm transaction rollback. Chứng minh bằng đọc từ transaction mới.
3. Catch exception trong method transactional rồi trả FAILED?
Nếu nuốt exception, proxy thấy return bình thường và có thể commit. Rethrow hoặc set rollback-only, đồng thời response phải trung thực.
4. @Modifying update DB nhưng entity vẫn giữ status cũ?
Bulk DML bypass persistence context/dirty checking. Clear/refresh hoặc tách boundary; cân nhắc flushAutomatically/clearAutomatically và pending changes.
5. Tại sao this.audit() với REQUIRES_NEW không commit riêng?
Self-invocation bỏ qua proxy. Tách audit sang bean khác; kiểm tra pool vì REQUIRES_NEW cần connection khác.
6. Custom @AuditedAction đôi lúc không chạy?
Kiểm tra retention runtime, pointcut, bean có do Spring quản lý, call có qua proxy, method private/final hay self-invocation.
7. Aspect audit ghi success nhưng transaction commit fail?
Advice có thể chạy trước transaction completion tùy order. Audit “committed” phải dùng after-completion/outbox semantics, không chỉ target return.
8. Hai request đồng thời cùng rút số dư cuối?
Dùng row lock hoặc optimistic version/atomic conditional update trong transaction; unique effect và invariant test. JVM synchronized không bảo vệ nhiều replicas.
9. Outbox event bị publish hai lần?
At-least-once là bình thường. Consumer Inbox/unique business key bảo đảm effect idempotent; monitor duplicate và Outbox age.
10. Scale từ 5 lên 50 tasks, mỗi Hikari pool 20?
Potential 1000 connections chưa tính headroom; có thể làm RDS collapse. Tính DB budget, cap tasks/pool/concurrency hoặc dùng proxy phù hợp.
11. CPU thấp nhưng transfer latency cao?
Tìm queue đầu tiên: Hikari wait, DB locks/I/O, executor, downstream, DNS/TLS hoặc SQS lag. CPU không phải autoscaling signal đủ.
12. Scale-in kill consumer giữa message?
Stop polling, drain trong grace period; nếu chưa ack thì message redeliver và consumer idempotent. Visibility timeout phải phù hợp processing time.
13. Một AZ mất thì “Multi-AZ” đã đủ?
Không nếu AZ còn lại thiếu compute/DB quota hoặc có zonal dependency. Tính static capacity, route/drain/failover và test game day.
14. Native PostgreSQL query hay JPQL?
JPQL khi entity query portable đủ dùng; native khi cần JSONB/CTE/window/RETURNING hoặc plan đặc thù. Đổi lấy coupling và mapping/test cost.
15. Transfer sang ngân hàng ngoài ở trạng thái bất định?
Giữ UNKNOWN/PENDING, không báo success giả hay retry mù; query provider reference, reconcile, manual review và audit/reversal path.

Rubric câu trả lời