CSDEMO 範例中 DeleteEmployeeProc(對應伺服器端 DELETE_EMPLOYEE)展示了存儲過程維護跨表資料一致性的強大能力:
PROCEDURE DELETE_EMPLOYEE
DECLARE VARIABLE any_sales INTEGER;
BEGIN
any_sales = 0;
SELECT count(po_number) FROM sales WHERE sales_rep = :emp_num INTO :any_sales;
IF (any_sales > 0) THEN
EXCEPTION reassign_sales; -- 業務規則阻擋:有業績不可直接刪除
-- 級聯清理關聯資料
UPDATE department SET mngr_no = NULL WHERE mngr_no = :emp_num;
UPDATE project SET team_leader = NULL WHERE team_leader = :emp_num;
DELETE FROM employee_project WHERE emp_no = :emp_num;
DELETE FROM salary_history WHERE emp_no = :emp_num;
DELETE FROM employee WHERE emp_no = :emp_num;
SUSPEND;
END
單一呼叫完成業務檢查、多表級聯更新/刪除,網路往返僅一次,極大降低客戶端複雜度與網路負載。
Delphi 提供隱式/顯式雙模式,顯式控制效能更優、粒度更細。核心元件為 TDatabase,關鍵屬性/方法:
TransIsolation:交易隔離等級(CSDEMO 採 tiReadCommitted)StartTransaction、Commit、Rollback 三大方法視窗顯示時開啟事務:
procedure TFrmTransDemo.FormShow(Sender: TObject);
begin
DmEmployee.EmployeeDatabase.StartTransaction;
DmEmployee.EmployeeTable.Open;
end;
視窗隱藏時提交:
procedure TFrmTransDemo.FormHide(Sender: TObject);
begin
DmEmployee.EmployeeDatabase.Commit;
end;
使用者手動提交:
if InTransaction and ConfirmThen
Commit; StartTransaction; EmployeeTable.Refresh;
使用者手動回滾:
if InTransaction and ConfirmThen
Rollback; StartTransaction; EmployeeTable.Refresh;
此模式實現「工作單元」語義:使用者編輯過程處於事務保護下,隨時可全盤接受或全盤放棄,確保資料一致性與使用者體驗並重。