django select_for_update

select_for_update
為了演示常見的并發(fā)問題担敌,我們將使用銀行賬戶模型,開始我們?yōu)閹魧嵗峁┮粋€簡單的存款和撤銷方法:
當兩個用戶同時在同一個帳戶上執(zhí)行操作時會發(fā)生什么?

1、用戶A提取帳戶 - 余額為100$。
2嚼黔、用戶B提取帳戶 - 余額為100$。
3惜辑、用戶B退出30$ - 余額更新為100$ - 30$ = 70$唬涧。
4、用戶A存款50$ - 余額更新為100$ + 50$ = 150$盛撑。

這里發(fā)生了什么碎节?用戶B要求提取30$,用戶A存入50$ - 我們預期余額為120$抵卫,但最終為150$狮荔。

為什么會這樣呢?
在步驟4介粘,當用戶A更新余額時殖氏,他在存儲器中存儲的金額已經(jīng)過時(用戶B已經(jīng)退出30$)。

為了防止這種情況發(fā)生姻采,我們需要確保我們正在處理的資源在我們正在計算的過程中不會改變雅采。

悲觀的做法表明,您應該完全鎖定資源,直到完成它 总滩。 如果沒有人可以在您處理對象時獲取對象上的鎖定纲堵,那么可以確保對象沒有被更改。

我們使用數(shù)據(jù)庫鎖有幾個原因:
1闰渔、 數(shù)據(jù)庫非常擅長管理鎖并保持一致性席函。
2、數(shù)據(jù)庫是訪問數(shù)據(jù)的最低級別 - 獲取最低級別的鎖也會防止其他進程嘗試修改數(shù)據(jù)冈涧。 例如茂附,DB中的直接更新,cron作業(yè)督弓,清理任務(wù)等营曼。
3、Django應用程序可以在多個進程 (例如工作者)上運行愚隧。 在應用程序級別維護鎖將需要大量(不必要的)工作蒂阱。

要在Django中鎖定一個對象,我們使用select_for_update 狂塘。

1录煤、我們在我們的查詢器上使用select_for_update來告訴數(shù)據(jù)庫鎖定對象,直到事務(wù)完成荞胡。
2妈踊、在數(shù)據(jù)庫中鎖定一行需要一個數(shù)據(jù)庫事務(wù) - 我們使用Django的裝飾器transaction.atomic來定義事務(wù)。
3泪漂、我們使用類方法而不是實例方法 - 我們告訴數(shù)據(jù)庫要上鎖廊营,然后它會返回鎖的對象給我們。 為了實現(xiàn)這一點萝勤,我們需要從數(shù)據(jù)庫中獲取對象露筒。 如果我們使用self,那么就是在操作一個已經(jīng)從數(shù)據(jù)庫中獲取出來的對象纵刘,這個對象無法保證自己是沒有被上鎖的邀窃。
4、帳戶中的所有操作都在數(shù)據(jù)庫事務(wù)中執(zhí)行假哎。
讓我們看看如何通過我們的新方法來阻止前面說的情況:
1瞬捕、用戶A要求退出30$:
用戶A獲取帳戶上的鎖。
余額為100美元舵抹。
2肪虎、用戶B要求存入50$:
嘗試獲取鎖定帳戶失敗(由用戶A鎖定)惧蛹。
用戶B等待鎖釋放 扇救。
3刑枝、用戶A撤回30$:
余額是70$。
帳戶上的用戶A的鎖定被釋放 迅腔。
4装畅、用戶B獲取帳戶上的鎖。
余額是70$沧烈。
新余額為70 + 50 = 120$掠兄。

5、賬號上用戶B的鎖定被釋放锌雀,余額為120$蚂夕。Bug消失了!

這里你需要了解select_for_update

1腋逆、在我們的方案中婿牍,用戶B等待用戶A釋放鎖,我們可以告訴Django 不要等待鎖釋放并引發(fā)DatabaseError惩歉。 為此等脂,我們可以將select_for_update的nowait參數(shù)設(shè)置為True, …select_for_update(nowait=True) 撑蚌。

2慎菲、選擇相關(guān)對象也被鎖定 -當使用select_for_update與select_related時,相關(guān)對象也被鎖定锨并。

例如,如果我們選擇與用戶一起select_related帳戶睬棚,用戶和帳戶將被鎖定第煮。 如果在存款期間,例如有人正在嘗試更新名字抑党,該更新將失敗包警,因為用戶對象被鎖定。

如果您正在使用PostgreSQL或Oracle底靠,這可能不是一個問題害晦,由于即將到來的Django 2.0 的新功能 。 在此版本中暑中,select_for_update具有“of”選項壹瘟,用于顯式地聲明要鎖定查詢中的哪些表 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳄逾,一起剝皮案震驚了整個濱河市稻轨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雕凹,老刑警劉巖殴俱,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政冻,死亡現(xiàn)場離奇詭異,居然都是意外死亡线欲,警方通過查閱死者的電腦和手機明场,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來李丰,“玉大人苦锨,你說我怎么就攤上這事∠犹祝” “怎么了逆屡?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踱讨。 經(jīng)常有香客問我魏蔗,道長,這世上最難降的妖魔是什么痹筛? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任莺治,我火速辦了婚禮,結(jié)果婚禮上帚稠,老公的妹妹穿的比我還像新娘谣旁。我一直安慰自己,他們只是感情好滋早,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布榄审。 她就那樣靜靜地躺著,像睡著了一般杆麸。 火紅的嫁衣襯著肌膚如雪搁进。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天昔头,我揣著相機與錄音饼问,去河邊找鬼。 笑死揭斧,一個胖子當著我的面吹牛莱革,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讹开,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼盅视,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旦万?” 一聲冷哼從身側(cè)響起左冬,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纸型,沒想到半個月后拇砰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梅忌,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年除破,在試婚紗的時候發(fā)現(xiàn)自己被綠了牧氮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡瑰枫,死狀恐怖踱葛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情光坝,我是刑警寧澤尸诽,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盯另,受9級特大地震影響性含,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸳惯,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一商蕴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芝发,春花似錦绪商、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至独悴,卻和暖如春理张,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绵患。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悟耘,地道東北人落蝙。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像暂幼,于是被迫代替她去往敵國和親筏勒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 在數(shù)據(jù)系統(tǒng)的殘酷現(xiàn)實中旺嬉,很多事情都可能出錯: 數(shù)據(jù)庫軟件管行、硬件可能在任意時刻發(fā)生故障(包括寫操作進行到一半時)。 ...
    冰菓_閱讀 440評論 0 1
  • 上期我們講到LoadRunner性能測SQL server等待類型邪媳,這期我們講LoadRunner性能測試如何跟蹤...
    82a7fe2508f4閱讀 246評論 0 0
  • 一捐顷、數(shù)據(jù)庫中的鎖 在數(shù)據(jù)庫中l(wèi)ock和latch都可以被稱為“鎖”荡陷。它們鎖的對象不一樣。latch是用來保證并發(fā)線...
    鐘離惜閱讀 264評論 0 0
  • 數(shù)據(jù)庫的鎖機制 并發(fā)控制 在計算機科學迅涮,特別是程序設(shè)計废赞、操作系統(tǒng)、多處理機和數(shù)據(jù)庫等領(lǐng)域叮姑,并發(fā)控制(Concurr...
    夢醒家先生閱讀 540評論 0 1
  • 支付操作出現(xiàn)的問題與解決方法 場景介紹 存在的問題 解決方法代碼級別加鎖數(shù)據(jù)庫級加鎖悲觀鎖樂觀鎖 最終結(jié)果 場景介...
    L_Y_CHENG閱讀 2,089評論 2 1