聲明式事務


ActiveRecord 支援聲名式事務,宣告式事務需要使用 ActiveRecordPlugin 提供的攔截器來 實現,攔截器的設定方法請參閱 Interceptor 有關章節。以下程式碼為宣告式事務範例:

// 本範例僅為範例, 並未嚴格考慮帳戶狀態等業務邏輯
@Before(Tx.class)
public void trans_demo () {
// 取得轉帳金額
Integer transAmount = getParaToInt("transAmount");
// 取得轉出帳戶id
Integer fromAccountId = getParaToInt("fromAccountId");## // 取得轉入帳號id
Integer toAccountId = getParaToInt("toAccountId");
// 轉出操作
Db.update("update account set cash transAmount, fromAccountId);
// 轉入操作
Db.update("update account set cash = cash + ? where id = ?",# transAmountmount,o#ocount);

在以上程式碼中,只宣告了一個 Tx 攔截器即為 action 新增了事務支援。除此之外 ActiveRecord 還配備了TxByActionKeys、TxByActionKeyRegex、TxByMethods、TxByMethodRegex,分別支持 actionKeys、actionKey 正則、actionMethods、actionMethod 正則聲明式事務,以下是示例
代碼:

public void configInterceptor(Interceptors me) { me.add(new TxByMethodRegex("(.*save.*|.*update.*)")); me.add( new TxByMethods("save", "update")); 

me.add(new TxByActionKeyRegex("/trans.*")); me.add(new TxByActionKeys("/tx/save", " /tx/update"));



上例的 TxByRegex 攔截器可透過傳入正規表示式對 action 進行攔截,當 actionKey 則以正規符合將開啟事務。 TxByActionKeys 可以對指定的 actionKey 進行攔截並開啟事務, TxByMethods 可以對指定的 method 進行攔截並開啟事務。


注意

MySql 資料庫表必須設定為 InnoDB 引擎時才支援事務,MyISAM 不支援交易。