從一次 SQL Timeout 排查,整理 Transaction、Retry 與 Idempotency
最近在處理一個付款流程問題時,遇到一支 API 發生 SQL timeout。 第一時間我先往 SQL query 本身去想,但後來把整個 request flow 跟時間線整理出來後,才發現問題跟前一支付款 API 的 transaction scope 有關。 這次排查剛好把幾個平常分開看的概念串在一起: Transaction Database Lock Third-party API Retry Compensation Idempotency Race Condition 這篇就記錄一下整個思考過程。 問題現象 流程大概是這樣: 付款 API ↓ 呼叫第三方系統 ↓ 後續查詢 API ↓ 成功頁面 實際發生問題時,付款 API 呼叫第三方系統後等待了很長一段時間。 同時間,後續另一支 API 需要查詢資料,但最後發生 SQL timeout,導致後面的流程沒有繼續。 一開始看到 SQL timeout,很自然會先懷疑: Query 是不是太慢? 但把兩支 API 的時間線放在一起看後,我注意到前一支付款 API 有使用 transaction,而且兩個流程都會碰到同一筆資料。 開始懷疑 Blocking 我的思路是:付款 API 有 transaction,後面的 API 又在讀相同資料,而且前面的 transaction 還沒有結束,那就有可能是 lock 還沒被釋放。 ...