2011-10-06 56 views
0

我應該在節點的CRUD鉤子(如hook_load,hook_insert等)中調用db_transaction()嗎?節點的API CRUD回調(Drupal)中的事務

UPD:問題的癥結在於,例如hook_update和hook_insert函數是從node_save()中調用的,並且它的代碼已經包裝在一個事務中。

回答

0

如果你正在執行多個查詢,並希望在其中一個失敗時選擇回滾,那麼是的。這樣做很安全,因爲每個db_transaction在其功能完成運行時都會超出範圍,所以您絕不應該處於開始新交易的位置,而另一個已經開放可以這麼說。

+0

這是真的。但問題的關鍵是,例如,hook_update和hook_insert函數是從node_save()中調用的,並且它的代碼已經包裝在一個事務中。 – skayfar

+0

在這種情況下,你絕對不應該從你的鉤子函數中調用'db_transaction' ......這是沒有意義的。 'node_save'中的'try ... catch'模塊會在任何時候回滾整個事務(包括在鉤子函數中執行的任何查詢),因此不需要創建單獨的事務 – Clive

+1

請注意,Drupal支持嵌套事務,因此理論上可以這樣做。但是,是的,由node_save()啓動的現有事務已經在出現問題時處理回滾。但是,有一些啓動嵌套事務的原因,基本上,如果您希望只能恢復您的更改(而不是與節點保存相關的所有更改)。 – Berdir