2010-06-29 37 views
1

我對Pylons + SQLAlchemy有問題。主塔+ SQLAlchemy問題:事務處於非活動狀態,原因是子事務中的回滾

當不順心的事(在我的情況下,它是完整的錯誤,由於競爭條件),並提高了數據庫錯誤,所有後面的requestы結果在錯誤被提出:

InvalidRequestError: The transaction is inactive due to a rollback in a subtransaction. Issue rollback() to cancel the transaction. 

雖然我可以防止發生這種原始錯誤(爭用條件),但我想要一個更強大的解決方案,我想防止一個錯誤導致整個應用程序崩潰。

這樣做的最好方法是什麼?有沒有辦法告訴Pylons回滾失敗的事務?

回答

1

最簡單的事情是確保在控制器中開始工作時使用新的SQLAlchemy會話。在/project/lib/base.py,添加了一種BaseController:

def __before__(self): 
    model.Session.close() 

Session.close()將清除出了會議並關閉所有打開的事務,如果有任何。您希望確保每次使用會話時都會在控制器中完成工作後清除。在控制器處理請求的開始時執行此操作將確保它始終被清除,即使線程的先前請求有異常並且存在回滾等待。

+0

謝謝,這似乎是做的伎倆 – 2010-07-01 08:40:21

0

您是否在您的控制器中使用yoursapp .lib.base。 BaseController

你可以看一下 Handle mysql restart in SQLAlchemy

您還可以趕上SA例外BaseController的try-finally塊,做會話回滾()

在BaseController SA會話中刪除http://www.sqlalchemy.org/docs/05/session.html#lifespan-of-a-contextual-session

+0

哦,謝謝,我現在看到在每次請求後會話都被刪除()。那麼,爲什麼在以下所有請求中都會出現錯誤? – 2010-06-29 11:54:16

+0

這個錯誤發生在處理SA Session的所有操作上? – estin 2010-06-29 14:12:41

+0

是的,非常。選擇,更新...所有請求都失敗。 – 2010-06-30 07:16:08

相關問題