CYBERSOFT
Đăng nhập

Kiểm thử đồng thời & tương tranh (Concurrency & Race Condition Testing) cho ví điện tử fintech

Chuyên công nghệFintechNâng caoChuẩn SEO
🗓 1 tháng trước19 phút đọc·👁 294 lượt xem👤 279 người đọc

Bài nâng cao: kiểm thử đồng thời (concurrency testing) qua ví điện tử VíNhanh — race condition, double-spend, khoá lạc quan/bi quan, deadlock, lost update, idempotency, thứ tự giao dịch. Quy trình thiết kế ca kiểm thử nhiều thao tác cùng lúc, 2 tình huống thật (số dư âm do rút đồng thời, giao dịch nhân đôi do double-tap), nhiều mockup giao diện, FAQ và trắc nghiệm 5 câu. Chuẩn SEO, dẫn về khóa Tester CyberSoft.

1. Tóm tắt nhanh & màn hình bạn sẽ test

⭐ TL;DR — Kiểm thử đồng thời (concurrency testing) kiểm tra hệ thống hoạt động đúng khi NHIỀU thao tác/giao dịch chạy song song thay vì tuần tự — trọng tâm bài này là race condition, double-spend, khoá lạc quan/bi quan, deadlock, lost update, idempotency và thứ tự giao dịch trên ví điện tử VíNhanh (rút tiền, chuyển tiền tức thời). Bạn sẽ học cách thiết kế ca kiểm thử mô phỏng nhiều người/thiết bị thao tác cùng lúc, đọc hiểu sơ đồ tranh chấp số dư, và tránh những lỗi âm thầm nhưng cực kỳ nghiêm trọng vì liên quan trực tiếp tới tiền thật. Nhiều mockup và trắc nghiệm cuối bài.

Nếu bạn đã quen kiểm thử một người dùng thao tác một lúc, bài này đưa bạn sang một lớp rủi ro hoàn toàn khác: điều gì xảy ra khi HAI HAY NHIỀU thao tác cùng chạm vào cùng một dữ liệu gần như CÙNG LÚC. Với hầu hết ứng dụng, lỗi kiểu này chỉ gây khó chịu nhẹ; nhưng với ví điện tử — nơi mỗi con số là tiền thật — một lỗi tương tranh có thể khiến số dư âm, tiền 'nhân bản' từ hư không, hoặc một giao dịch bị trừ tiền hai lần. Đây cũng là dạng lỗi khó tìm nhất: chạy tuần tự thì luôn PASS, chỉ lộ ra khi đúng hai request va vào nhau trong một cửa sổ vài chục mili-giây. Chúng ta sẽ học qua ví điện tử VíNhanh: rút tiền, chuyển tiền tức thời, và cách hai thiết bị/hai người dùng có thể 'đua' nhau trên cùng một số dư.

🔒 vinhanh.vn/vi/vi-dien-tu/rut-tien VíNhanh · Ví điện tử VíNhanh · Rút tiền — 2 thiết bị cùng thao tác trên 1 ví Thiết bị A · Số dư trước lệnh 6.000.000đThiết bị B · Số dư trước lệnh 6.000.000đThiết bị A · Số tiền rút 5.000.000đThiết bị B · Số tiền rút 5.000.000đThiết bị A · Kết quả THÀNH CÔNG lúc 10:22:01.120Thiết bị B · Kết quả THÀNH CÔNG lúc 10:22:01.180✗ không hợp lệSố dư cuối (kỳ vọng) 1.000.000đ hoặc 1 lệnh bị từ chốiSố dư cuối (thực tế) -4.000.000đ✗ không hợp lệ BUG: cả 2 lệnh đều báo thành công DOUBLE-SPEND: số dư âm thật
Màn hình VíNhanh: 2 thiết bị cùng rút tiền, cả 2 báo THÀNH CÔNG khiến số dư âm (double-spend)
📖 Concurrency Testing: kiểm thử hệ thống khi nhiều thao tác/giao dịch chạy song song thay vì tuần tự, nhằm phát hiện các lỗi chỉ xuất hiện do tương tranh dữ liệu.

2. Race condition, double-spend & vì sao ví điện tử đặc biệt rủi ro

Cơ chế gây ra race condition thường theo một khuôn mẫu quen thuộc gọi là 'đọc-sửa-ghi' (read-modify-write): hệ thống ĐỌC số dư hiện tại, TÍNH số dư mới sau giao dịch, rồi GHI lại số dư đó. Nếu hai giao dịch cùng đọc số dư ở gần như cùng một thời điểm — trước khi giao dịch kia kịp ghi — cả hai sẽ tính toán dựa trên CÙNG một số dư ban đầu, và giao dịch ghi sau sẽ VÔ TÌNH GHI ĐÈ lên kết quả của giao dịch ghi trước, khiến một trong hai giao dịch 'biến mất' khỏi số dư cuối cùng dù cả hai đều đã báo thành công với người dùng.

2 giao dịch RÚT TIỀN đồng thời tranh chấp cùng 1 số dư (race condition) Đọc số dư (T1) Đọc số dư (T2) Ghi: -5.000.000đ Ghi đè: -5.000.000đThiết bị ARút 5.000.000đThiết bị BRút 5.000.000đBản ghi Số dưbalance = 6.000.000đSố dư sau 2 lệnhKỳ vọng 0đ · Thực tế -4.000.000đ
Sơ đồ 2 giao dịch rút tiền đồng thời cùng đọc 1 số dư, giao dịch ghi sau ghi đè lên giao dịch ghi trước (lost update)

Double-spend — thuật ngữ vốn quen thuộc trong tiền mã hoá nhưng áp dụng y hệt cho ví điện tử truyền thống — là hậu quả trực tiếp có thể quan sát được của race condition: CÙNG một khoản tiền được 'chi' thành công NHIỀU HƠN MỘT LẦN. Với một sàn thương mại điện tử, một lỗi tương tranh hiếm gặp có thể chỉ gây một đơn hàng bị trùng, xử lý thủ công là xong; nhưng với ví điện tử, mỗi lần double-spend là tiền thật rời khỏi hệ thống mà không có gì đối ứng — công ty phải bù lỗ, hoặc tệ hơn, hệ thống đối soát không phát hiện ra và lỗ hổng bị lợi dụng lặp lại có chủ đích.

📖 Double-Spend: hiện tượng cùng một khoản tiền được rút/chi/sử dụng thành công nhiều hơn một lần do lỗi xử lý đồng thời không khoá đúng dữ liệu.
📖 Lost Update: khi hai giao dịch cùng đọc rồi ghi lại một dữ liệu, giao dịch ghi sau vô tình ghi đè kết quả của giao dịch ghi trước, khiến giao dịch đó 'mất tích' khỏi kết quả cuối.

3. Khoá lạc quan, khoá bi quan & deadlock — vũ khí chống tương tranh

Để ngăn lost update, hệ thống cần một cơ chế KHOÁ để đảm bảo tại một thời điểm chỉ một giao dịch được phép thay đổi cùng một dữ liệu. Có hai chiến lược phổ biến. Optimistic locking (khoá lạc quan) 'đặt cược' rằng tranh chấp hiếm khi xảy ra: không khoá trước, chỉ gắn một số hiệu version vào bản ghi, và khi ghi mới so sánh version hiện tại với version lúc đọc — nếu có giao dịch khác đã ghi trước (version đã đổi), hệ thống từ chối và yêu cầu thử lại. Pessimistic locking (khoá bi quan) 'đặt cược' ngược lại: khoá hẳn bản ghi ngay khi giao dịch bắt đầu, mọi giao dịch khác muốn đụng vào cùng dữ liệu phải xếp hàng chờ tới khi khoá được giải phóng.

So sánh khoá lạc quan (Optimistic) vs khoá bi quan (Pessimistic) trong kiểm thử đồng thời Tiêu chíOptimistic LockingPessimistic LockingCách hoạt độngĐọc kèm số hiệu version; khi ghi so sánh version, lệch thì từ chối & yêu cầu thử lạiKhoá bản ghi ngay khi bắt đầu giao dịch (SELECT ... FOR UPDATE), giao dịch khác phải chờHiệu năng khi ít tranh chấpCao, hầu như không tốn chi phí khoáThấp hơn vì luôn giữ khoá dù ít khi đụng độHiệu năng khi tranh chấp caoNhiều giao dịch bị từ chối, phải retry liên tụcỔn định hơn nhưng dễ gây nghẽn hàng đợiRủi ro tester cần kiểm chứngCa kiểm thử phải xác nhận có RETRY đúng cách, không lặp vô hạnCa kiểm thử phải xác nhận KHÔNG xảy ra DEADLOCK giữa 2 khoá chéo nhauPhù hợp vớiGiao dịch đọc nhiều, ghi ít xung đột (vd xem số dư, lịch sử)Giao dịch tài chính có xác suất tranh chấp cao (rút/chuyển cùng 1 ví)Nhiều hệ thống ví điện tử dùng pessimistic locking cho bước GHI số dư, optimistic cho các bước ĐỌC còn lại.
So sánh khoá lạc quan (optimistic) và khoá bi quan (pessimistic): cách hoạt động, hiệu năng, rủi ro cần tester kiểm chứng

Chọn sai chiến lược khoá — hoặc chọn đúng nhưng cài đặt sai — sinh ra hai họ lỗi khác nhau mà tester cần biết cách phân biệt để kiểm thử đúng trọng tâm. Với optimistic locking, lỗi thường gặp là RETRY không được xử lý đúng: người dùng bị từ chối giao dịch nhưng ứng dụng không thử lại tự động hoặc không báo rõ lý do, khiến trải nghiệm giống như 'app bị treo' dù về bản chất hệ thống đang bảo vệ dữ liệu đúng cách. Với pessimistic locking, rủi ro nghiêm trọng hơn là DEADLOCK: khi giao dịch A khoá tài khoản 1 rồi chờ khoá tài khoản 2, trong lúc giao dịch B đã khoá tài khoản 2 và đang chờ khoá tài khoản 1 — cả hai kẹt vĩnh viễn, chờ nhau tới khi hệ thống hết timeout hoặc phải khởi động lại. Một hệ thống ví điện tử tốt luôn khoá tài khoản theo một THỨ TỰ CỐ ĐỊNH (ví dụ theo ID tăng dần) để loại trừ khả năng deadlock kiểu này.

📖 Optimistic Locking: khoá lạc quan: không khoá trước, so sánh version dữ liệu khi ghi và từ chối nếu đã bị giao dịch khác thay đổi trước.
📖 Pessimistic Locking: khoá bi quan: khoá hẳn dữ liệu ngay khi giao dịch bắt đầu, buộc mọi giao dịch khác phải chờ tới khi khoá được giải phóng.
📖 Deadlock: khoá chết: hai hoặc nhiều giao dịch cùng giữ một phần khoá và chờ khoá còn lại mà bên kia đang giữ, khiến tất cả kẹt vĩnh viễn.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!