- 首頁|
- linux|
- ruby|
- ROR|
- 敏捷開發|
- 扯|
- 桌面show|
- Ajax on rails|
- design pattern|
- The Ruby Way |
- railscast|
- 技巧|
- mac|
- mysql|
- 粒計算|
- 數工|
- flex on rails
熱門文章
搜索BLOG文章
最新評論
- [匿名]admin:什麼玩藝?
- [匿名]lynn1221:每一種數據庫系統都有優點和缺點,..
- [匿名]sfsa:垃圾檢測
- [匿名]aoner:這問題2.3.8都還沒解決,用了你的方..
- fsjoy1983:廢話,你在.git外部一層目錄執行能..
51CTO推薦博文
更多>>A帳戶向B帳戶轉賬100塊,這個事情一定要發生兩件事情,A的帳戶上減去100塊,B的賬戶上加上100塊。如果半路發生問題而中斷這個事情,那麼必須回滾到初始狀態。
下面來看一下用rails來實現這個例子:
首先,建立模型類account, 數據遷移:
在account類中定義方法:
實施數據遷移。運行console
>> peter = Account.create(:balance=>100, :number=>"12345")
>> paul = Account.create(:balance=>200, :number=>"54321")
#create直接創建並保存到accounts表中
現在數據庫中的內容#SELECT * FROM account_development.account
繼續在console裏運行:
>> Account.transaction do
?> paul.deposit(10)
>> peter.withdraw(10)
>> end
此時數據庫中的內容:
現在再來看看異常情況,1.從peter帳戶上轉350出去給peter
>> Account.transaction do
?> paul.deposit(350)
>> peter.withdraw(350)
>> end
------
這時拋出了異常:
ActiveRecord::RecordInvalid: Validation failed: Balance is negative!
---數據庫還是保持原樣:
2.從peter賬戶上轉10出去給tom
>> Account.transaction do
?> paul.deposit(10)
>> tom.withdraw(10)
>> end
----拋出異常:
NameError: undefined local variable or method `tom' for #<Object:0x389a0>
數據庫依然保持原樣。
雖然數據庫依然保持原樣,但是模型對象會發生變化,look:
現在還是恢復原狀,peter有100塊,paul有200塊
現在執行:
結果出乎意料,
Transfer aborted!
Paul has 550.0
peter has -250.0
模型對象已經被改變了!
原因就在於ActiveRecord並沒有跟蹤對象在事務前後的狀態,實際上它也跟蹤不了, 因爲沒有一種簡單的辦法可以知道哪些模型對象參與了事務。爲了解決這個問題,我們可以把涉及一次事務的模型對象以參數的形式明確的告訴transaction
這次結果就跟我們料想的一樣了:
T