作者MacPerson (Gary)
看板Python
標題[問題]Django Transaction error
時間Wed Nov 19 21:16:19 2014
各位好:
今天在做除錯時,剛好中斷點下在Transaction中,然後並沒有跑到commit或
roolback就將程式結束,之後只要再跑到那一段,要做transaction時,會造成
transaction lock,附上錯誤訊息如下:
﹝this is forbidden when an 'atomic' block is active﹞
看到此一訊息,直覺上知道DB lock,因此跑到mysql看執行序是否有異常,
但並沒有看到異常執行緒,此時沒有頭緒,一發狠將執行緒全砍掉,
但依舊還是會秀出錯誤訊息。因此想了解django Transaction 機制,
交易機制看起來並沒有控制在DB這邊,因此好奇Django是如何做到,
也想問問發生此一錯誤訊息時,該如何解救,想想很恐怖(線上會因此停擺)。
以下附上我做Transaction的程式碼:
from django.db import transaction
transaction.set_autocommit(False,using="DATABASE")
try:
with transaction.atomic(using="DATABASE"):
開始進行資料庫操作(也就是在此處將程式中斷,造成Transaction lock)
transaction.set_autocommit(True, using="DATABASE")
except:
transaction.rollback(True,using="DATABASE")
謝謝各位
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.234.122.131
※ 文章網址: http://www.ptt.cc/bbs/Python/M.1416402981.A.BF3.html
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 21:19:13
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 21:19:19
→ uranusjr: 沒有 traceback, 做了什麼資料庫操作也不說, 只能通靈了 11/19 22:30
→ uranusjr: BTW 你的程式邏輯不對, 如果出錯 autocommit 回不去 11/19 22:35
請問autocommit回不去的意思是? 我確定rollback是可以work的
記憶中,只要做roolback或commit其中一個後,整個transactioin就算完成
autocommit就會恢復
而這個錯誤會發生是因為我中斷執行,並沒有觸發到rollback或commit
造成這個錯誤後,該怎麼把他恢復?這是我好奇的地方
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 23:07:23
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 23:08:00
→ uranusjr: 誰和你說 rollback/commit 後 autocommit 會自己回來的 11/19 23:37
→ uranusjr: 至少文件看一下嘛, 不要自己在那裡用直覺猜 11/19 23:38
謝謝指導~ 的確寫得不夠完整~ 只是autocommit沒把他開啟,我之後下的insert
update都還是會過,真的是誤打誤撞
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 23:42:00
※ 編輯: MacPerson (36.234.122.131), 11/19/2014 23:42:34