2011-11-27 49 views
3

我有一個基於Django的web應用程序,它使用PostgreSQL作爲後端通過psycopg2。現在我們正在使用postgres 8.4.x,但將來會轉向9.1.x。我們正在使用Django的當前穩定版本(1.3.1)。在PostgreSQL上爲Django配置REPEATABLE READ或SERIALIZED事務隔離

我想在REPEATABLE READ或SERIALIZABLE級別啓用更嚴格的事務隔離(按照postgres docs)。從psycopg2源,可用的是:

"""Isolation level values.""" 
ISOLATION_LEVEL_AUTOCOMMIT   = 0 
ISOLATION_LEVEL_READ_UNCOMMITTED = 1 
ISOLATION_LEVEL_READ_COMMITTED  = 2 
ISOLATION_LEVEL_REPEATABLE_READ  = 3 
ISOLATION_LEVEL_SERIALIZABLE  = 4 

不幸的是,Django的1.3.1的的_set_isolation_level() psycopg2後端實現包括assert level in (0, 1)這似乎用這種方法來設置隔離級別一樣高我希望立即排除。

在Django主幹的recent commit中,很高興地看到這個限制已經放寬到允許級別高達4,但是,仍然沒有通過普通的Django設置來選擇實際指示後端的選項您希望獲得比ISOLATION_LEVEL_READ_COMMITTED更高的隔離級別。換句話說,儘管_set_isolation_level()現在可以接受高達4的級別,但沒有基於配置的方式來實際使其以4作爲參數被調用。

問題:

  • 假設我願意開始使用Django的devel的版本,以獲得這種變化,什麼是正確的/推薦的方法來調用_set_isolation_level()手動鑑於存在,這將導致沒有任何配置選項在它被稱爲與我想要的隔離級別?

  • 假設我是而不是願意使用Django的開發版本,推薦使用Django 1.3.1將期望的隔離級別傳遞給psycopg2的方法是什麼?

  • Django的當前版本和未來版本是否使得難以指定這些更高的隔離級別,因爲它們會在實踐中造成巨大的問題? (即我應該這樣做嗎?)請記住,我們的應用程序具有相對較低的數據庫吞吐量,對於一致性要求非常高的大型不常見事務。

在此先感謝您的任何建議。

回答

2

這樣做是寫自己的DB適配器,從Django默認的繼承和讓你設置自己的隔離級別覆蓋的方法最簡單,最兼容的方式。

+0

當然...做到了這一點,它似乎工作正常。需要一些額外的配置,使南不會嚇壞,但否則非常無痛。 – glenc

1

這似乎很奇怪。 AUTOCOMMIT不是事務隔離級別。 READ COMMITTED是PostgreSQL的默認設置,你可以通過1或2獲得READ COMMITTED行爲。

我認爲你正在尋找set_session([isolation_level,] [readonly,] [deferrable,] [autocommit])

不要Django的當前及未來版本使它很難指定 這些較高的隔離級別,因爲它們導致 實踐巨大的問題?

據我所知,問題更多的是與MySQL和向後兼容性比PostgreSQL。 MySQL默認爲REPEATABLE READ;一些Django開發人員認爲READ COMMITTED行爲沒有像應該那樣進行徹底測試。

https://code.djangoproject.com/ticket/13906