2011-12-03 14 views
1

我建立了一個基於TurboGears應用程序,以2分貝工程 - 第二個 - 這我指的是MSSQL數據庫 - 被其他應用程序(不礦用 - 我的應用程序實際上是解決問題的破解 - 這樣我就可以使用無法控制的其他應用程序或MSSQL數據庫設置)釋放turbogears2處理具體的DB(控制事務管理器)

我正在寫一個特定的數據庫表與SQLAlchemy的(通過的TurboGears):

DBSession.add(object) 
DBSession.flush() 

的數據被寫入到數據庫 - 但TurboGears的應用程序保留在數據庫某種手柄,使使用DB選項卡中的主廣告應用程式樂可以從中讀取,但不能改變它。直到我停止渦輪機應用程序,然後一切正常。 我試着撥打:

DBSession.close() 

但隨後的數據被神奇地從數據庫中刪除 - 可能是一個事務回滾。 我也試着撥打:

transaction.doom() 

,有着相近的效果(或沒有任何影響,我不知道)

我讀到,在TurboGears的事務管理器(我猜repoze.tm)處理提交 但我無法確定 - 它何時被調用?我如何控制它?特別是當函數完成它的計劃運行時如何刪除數據庫句柄(我不能結束腳本,它是一個cron作業,每小時運行一次)。該tg2.1文檔是對這個問題非常不清楚

我也讀的地方,我應該重寫commit_veto - 但不明白 - 我應該怎麼做,在哪裏呢?在我的應用程序中,我應該調用transaction.abort().doom()或其他什麼?

我也嘗試使用事務掛鉤相同的功能,但並沒有成功實際調用掛鉤

感謝您的幫助。

版本數據:

  • 的TurboGears 2.1.3
  • SQLAlchemy的0.7
  • MSSQL 2005
  • 使用pyodbc連接MSSQL

回答

0

DBSession.flush()執行SQL,但不承諾。你必須調用DBSession.commit()完成交易(不是需要顯式調用flush()在這種情況下,commit()將做到這一點)。在commit()之後SQLAlchemy啓動新的事務,但這不應該是個問題,因爲數據通常只在執行某些SQL語句時被鎖定。

+0

我會接受,雖然我發現這個問題是有一點不同 - TG2處理提交基於repoze.tm所以實際上調用DBSession.commit()一個事務管理器給出錯誤信息,你應該真的叫交易。承諾() – alonisser