何爲數據庫SQL“進攻型”編程或"積極型"編程?通常指先處理大概率發生事件,然後再處理小概率異常事件。我們以企業進銷存軟件銷售模塊中常見的銷售訂單審覈爲例,談談SQL“進攻型”編程和“防禦型”編程的差異。
1、銷售訂單審覈,程序要做的事情
以傳統的飲料企業爲例,銷售訂單審覈,程序會做如下幾個事情:
1)訂單狀態變更:錄入狀態 --> 已審覈狀態;
2)扣減客戶資金(可用資金或折扣、報損等臺賬資金);
3)…
訂單在“錄入”狀態還可以:
1)客戶自己關閉訂單,錄入狀態 變成 已關閉狀態;
2)企業銷售內勤關閉訂單,比如所報產品沒貨,短期有無生產安排;
3)他人審覈;
所以,訂單審覈時,必須覈實訂單狀態是否爲“錄入”狀態,只有錄入狀態,纔可以審覈。
2、SQL處理方式
1)進攻型編程處理方式
update sale_order set status = '已審覈' where id = 1 and status = '錄入';
if (@affectedRows != 1) {
報錯:"審覈失敗,訂單狀態發生變化,請刷新頁面重試"
}
...
2)防禦性編程處理方式
先獲取訂單:
select * from sale_order where id = 1;
判斷訂單狀態 是否爲 錄入狀態:
if (order.status != "錄入") {
報錯:"審覈失敗,訂單狀態發生變化,請刷新頁面重試"
}
更新訂單狀態:
update sale_order set status = '已審覈' where id = 1;
...
3、小結
從上可以看出,SQL“進攻型”編程 相對 “防禦性”編程來說:
1)代碼少、簡潔,開發效率高;
2)可以少執行一次查詢SQL,性能更好;
對於企業信息化來說,實際操作中有很多類似訂單審覈這樣一錄、一審的操作,還有多人同時審覈的操作,建議儘量使用SQL“進攻型”編程,代碼簡潔,便於維護。