2014-03-01 22 views
0

我已經搜查,發現樣品:如果選擇SQL命令適用於Rails Model事務?

Account.transaction do 
    paul.deposit(10) 
    peter.withdraw(10) 
end 

我猜事務工作作爲「當交易完成後,開始做另一個事務」。存款/取款是一個更新SQL命令。如果我可以使用選擇(查詢)SQL命令就像這個樣本?

Account.transaction do 
    condition = person.where("name='paul' and money>=100'").count # query SQL command 
    if condition>0 
     paul.deposit(10) 
    end 
end 

我發現的所有示例都是更新SQL事務示例。 我可以猜這個代碼工作沒有錯誤值,如果有兩個事務?

回答

1

要使其工作,您必須LOCKSELECT查詢。這樣就可以鎖定這些行,並使用SQL語法。

condition = person.where("name='paul' and money>=100'").lock(true).count 
0

是的,它會工作。

當你在transaction塊內傳遞代碼時,它僅僅意味着如果塊內有任何失敗,一切都會回滾。這也意味着沒有內部的或者說嵌套的db事務發生,哪些rails默認提供它。