rails事務

 

博客統計信息

51cto推薦博客 
用戶名:fsjoy1983
文章數:301
評論數:209
訪問量:216647
無憂幣:2384
博客積分:3838
博客等級:7
註冊日期:2008-02-04

 

我的技術圈(3)

更多>>
 
 rails實現“事務”的方法
2008-09-02 12:48:14
標籤:rails 事務
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://fsjoy.blog.51cto.com/318484/96738
在學習數據庫時,曾經提到事務,最典型的一個實例就是銀行轉賬的問題。
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
發佈了13 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章