API 層策略雖健壯,但對高吞吐量、高並發應用而言,長事務持有資源鎖過久,導致連接耗盡、死鎖、鎖升級(行級→頁級→表級)。高並發事務策略通過極小化事務作用域,縮短鎖持有時間,換取性能與並發能力,但需承擔數據一致性風險的折衷。
決策建議:先用 API 層策略進行高負載測試;若出現吞吐量低、死鎖、等待多,再遷移至高並發策略。

將所有讀取、驗證、合規檢查移至事務外部,僅將寫操作包裹在極短事務中。
@TransactionAttribute(REQUIRED)
public void processTrade(TradeData trade) {
// 所有讀取、驗證、合規、寫操作均在事務內
TraderData trader = service.getTrader(trade.getTraderID());
validateTraderEntitlements(trade, trader);
verifyTraderLimits(trade, trader);
performPreTradeCompliance(trade, trader);
service.insertTrade(trade);
AcctData acct = service.getAcct(trade.getAcctId());
verifyFundsAvailability(acct, trade);
adjustBalance(acct, trade);
service.updateAcct(trade);
performPostTradeCompliance(trade, trader);
}
public void processTrade(TradeData trade) {
UserTransaction txn = null;
try {
// 1. 事務外:所有讀取、驗證、計算
TraderData trader = service.getTrader(trade.getTraderID());
validateTraderEntitlements(trade, trader);
verifyTraderLimits(trade, trader);
performPreTradeCompliance(trade, trader);
AcctData acct = service.getAcct(trade.getAcctId());
verifyFundsAvailability(acct, trade);
adjustBalance(acct, trade);
performPostTradeCompliance(trade, trader);
// 2. 極短事務:僅寫操作
txn = (UserTransaction) ctx.lookup("UserTransaction");
txn.begin();
service.insertTrade(trade);
service.updateAcct(trade);
txn.commit();
} catch (Exception up) {
if (txn != null) txn.rollback();
throw up;
}
}
關鍵風險:讀取數據無鎖保護,若同一實體被併發修改,提交時可能拋出失效數據異常(需 ORM 版本檢查機制輔助)。前提假設:單用戶操作單一實體(如交易者僅操作自己的帳戶)。
@TransactionManagement(TransactionManagementType.BEAN) // 類級別,不可混用聲明式
@Stateless
public class TradingServiceImpl { ... }
保持聲明式事務模型,將寫操作下沉至調用棧較低層的公共方法,該方法標記 REQUIRED 啟動事務。
@TransactionAttribute(SUPPORTS) // 父方法無事務
public void processTrade(TradeData trade) {
// 讀取、驗證、計算...
processTradeUpdates(trade, acct); // 調用寫方法
}
@TransactionAttribute(REQUIRED) // 子方法啟動事務
public void processTradeUpdates(TradeData trade, AcctData acct) {
try {
service.insertTrade(trade);
service.updateAcct(trade);
} catch (Exception up) {
ctx.setRollbackOnly();
throw up;
}
}
隱患:非事務擁有者(子方法)執行回滾,父方法無法感知、無法採取糾正措施,提交時可能拋異常。實現缺乏一致性,像「缺牙的曲棍球員」。
REQUIRED 而非 MANDATORY,防止調用鏈中意外啟動新事務。高並發策略是「在刀尖上跳舞」:以受控的一致性風險換取極致並發。選型前必須量化業務對失效數據的容忍度,並建立完善的版本檢查與重試機制。對於標準業務應用,API 層策略仍是首選;僅在證實並發瓶頸無法通過索引優化、分庫分表解決時,才考慮此策略。