2015-02-05 32 views
2

我在Django與atomic()一個問題:Django的:原子():強制交易,如果已經提高Asse田事務內部

https://docs.djangoproject.com/en/1.7/topics/db/transactions/#django.db.transaction.atomic

對於一些方法(稱爲外請求/響應週期),我需要可以肯定的是,該方法在一次交易中執行。我必須強制持久。如果已經在事務中,atomic()會默默使用保存點。

記住:ACID http://en.wikipedia.org/wiki/ACID

  • 原子性
  • 一致性
  • 隔離
  • 耐久性< ---這就是我想要給力。

關鍵字參數savepoint對於atomic()在這裏沒有幫助。如果您使用savepoint = False atomic()默默無聞(根據文檔),如果已經在交易中。

我需要一個異常,如果它已經是一個正在運行的事務。

不幸的是舊的is_managed()已被棄用而沒有替換。

我如何創建一個atomic_raise_exception_if_already_in_transaction()修飾器?

回答

1

如果你只使用atomic(),那麼你可以檢查連接的in_atomic_block屬性:

>>> from django.db import transaction 
>>> transaction.get_connection().in_atomic_block 
False 
>>> with transaction.atomic(): 
...  print transaction.get_connection().in_atomic_block 
... 
True 
>>> transaction.get_connection().in_atomic_block 
False 
>>> 
1

檢測數據庫連接上是否存在正在運行的事務取決於您的數據庫後端庫的行爲。例如。 psycopg2 for postgresql在上次事務完成時提交新查詢時會隱式啓動新事務,除非顯式自動提交模式已啓用。在前一種情況下,所有查詢都將在事務內部運行,因此除了提交當前事務外,沒有可靠的檢查。

另一方面,您可以檢測atomic塊是否處於活動狀態,請參閱docs。您可以使用connection.in_atomic_block屬性來檢查是否有任何atomic塊已激活。