Django 事務(wù)詳解

Django 1.4 事務(wù)默認(rèn)模式是autocommit模式,每個(gè)查詢都相當(dāng)于一個(gè)事務(wù),每次查詢都直接提交commit事務(wù),
除非事務(wù)被禁止

Django’s default behavior is to run in autocommit mode. Each query is immediately committed to the database, unless a transaction is active.

Transaction

  • @transaction.autocommit() 使用django默認(rèn)事務(wù)模式,就是每個(gè)查詢都相當(dāng)于一個(gè)事務(wù),提交后自動(dòng)commit
  • @transactioncommit_on_success() ((django 1.8: transaction.atomic() ) 自己控制view或者其他需要事務(wù)的代碼
  • @transaction.commit_manually() 自己控制commit和rollback,所以代碼里面必須顯式調(diào)用commit 或者 rollback,哪怕只有讀的查詢

在view里面的使用:

  1. 裝飾器
@transaction.commit_on_success
def view():
    a.save()
    b.save()
    return ...
  1. with用法
def func()
    with transaction.commit_on_success():
        a.save()
        b.save()
    return ...

執(zhí)行查看mysql 的genernal_log

        # django 根據(jù)db讀寫路由,使讀和寫各生成了一個(gè)connect 鏈接數(shù)據(jù)庫

        # 32455 這個(gè)是負(fù)責(zé)查詢
        32455 Connect   root@172.16.30.17 on owan
        32455 Query SET NAMES utf8mb4
        32455 Query set autocommit=0
        32455 Query SET SQL_AUTO_IS_NULL = 0
        32455 Query SELECT ... from a WHERE `id` = 20

        # 32456 這個(gè)是負(fù)責(zé)更新
        32456 Connect   root@172.16.30.17 on owan
        32456 Query SET NAMES utf8mb4
        32456 Query set autocommit=0
        32456 Query SET SQL_AUTO_IS_NULL = 0
        32456 Query SELECT (1) AS `a` FROM `user_community_signin` WHERE `user_community_signin`.`id` = 20  LIMIT 1
        32456 Query UPDATE a SET `user_id` = ....

        # 32455 這個(gè)是負(fù)責(zé)查詢 ,第二個(gè)查詢,依然使用32455這個(gè)鏈接
        32455 Query SELECT ...from b where .`id` = 1

        # 32456 依然使用這個(gè)32456鏈接來更新數(shù)據(jù)
        32456 Query SELECT (1) AS `a` FROM `community_point` WHERE `community_point`.`id` = 1  LIMIT 1
        32456 Query UPDATE b set `id` = ...

        # 32456  更新操作commit
        32456 Query commit    
        # (rollback 如果兩個(gè)更新有任何出錯(cuò))
        # 32455 Query   rollback    
        # 32456 Query   rollback   
        32455 Quit  
        32456 Quit

如果沒有加 transaction.commit_on_success裝飾器

        32678 Query UPDATE  a ...
        32678 Query commit

        32678 Query UPDATE b ...
        32678 Query commit

讓我們理清這個(gè)流程:

  • django 默認(rèn)模式是每個(gè)查詢都是一個(gè)事務(wù),默認(rèn)模式會(huì)在a.save(), b.save()分別提交commit一次,這樣就沒有兩個(gè)操作包在一起做事務(wù)的功能.所以我們使用了 transaction.commit_on_success 裝飾器, 意味著全部操作成功才提交commit,而不是每個(gè)查詢各自commit
  • 在view里面使用 transaction.commit_on_success, 使這個(gè)view的所有操作都是事務(wù)執(zhí)行的
  • 由于django的讀寫db有設(shè)置db路由,使得讀寫db分別使用了不同的DB鏈接,看general_log看出來,讀和寫都有一個(gè)connect的操作 讀id: 32455, 寫id: 32466
  • id: 32466鏈接負(fù)責(zé)更新操作,成功之后commit完成事務(wù),如果中途某個(gè)更新操作出錯(cuò),將會(huì)回滾事務(wù)rollback

Savepoints

savepoint是一個(gè)可以讓事務(wù)回滾到指定位置的標(biāo)記, 默認(rèn)的事務(wù)回滾時(shí)整個(gè)事務(wù)所有操作都回滾,這樣開銷會(huì)大,如果想回滾一部分,那就用savepoint標(biāo)記某個(gè)位置,回滾的時(shí)候回到某個(gè)點(diǎn)

from django.db import transaction

@transaction.commit_manually
def viewfunc(request):

  a.save()
  # open transaction now contains a.save()
  sid = transaction.savepoint()

  b.save()
  # open transaction now contains a.save() and b.save()

  if want_to_keep_b:
      transaction.savepoint_commit(sid)
      # open transaction still contains a.save() and b.save()
  else:
      transaction.savepoint_rollback(sid)
      # open transaction now contains only a.save()

  transaction.commit()

Mysql 事務(wù)

MySQL默認(rèn)操作模式就是autocommit自動(dòng)提交模式椰憋。這就表示除非顯式地開始一個(gè)事務(wù),否則每個(gè)查詢都被當(dāng)做一個(gè)單獨(dú)的事務(wù)自動(dòng)執(zhí)行橙依。我們可以通過設(shè)置autocommit的值改變是否是自動(dòng)提交autocommit模式证舟。
通過以下命令可以查看當(dāng)前autocommit模式

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.04 sec)
從查詢結(jié)果中窗骑,我們發(fā)現(xiàn)Value的值是ON,表示autocommit開啟创译。我們可以通過以下SQL語句改變這個(gè)模式
1
mysql> set autocommit = 0;
值0和OFF都是一樣的,當(dāng)然软族,1也就表示ON刷喜。通過以上設(shè)置autocommit=0立砸,則用戶將一直處于某個(gè)事務(wù)中,直到執(zhí)行一條commit提交或rollback語句才會(huì)結(jié)束當(dāng)前事務(wù)重新開始一個(gè)新的事務(wù)颗祝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浊闪,一起剝皮案震驚了整個(gè)濱河市恼布,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁宾,老刑警劉巖折汞,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異猛铅,居然都是意外死亡字支,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門奸忽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堕伪,“玉大人,你說我怎么就攤上這事栗菜∏反疲” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵疙筹,是天一觀的道長富俄。 經(jīng)常有香客問我,道長而咆,這世上最難降的妖魔是什么霍比? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮暴备,結(jié)果婚禮上悠瞬,老公的妹妹穿的比我還像新娘。我一直安慰自己涯捻,他們只是感情好浅妆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著障癌,像睡著了一般凌外。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涛浙,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天康辑,我揣著相機(jī)與錄音,去河邊找鬼轿亮。 笑死晾捏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哀托。 我是一名探鬼主播惦辛,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仓手!你這毒婦竟也來了胖齐?” 一聲冷哼從身側(cè)響起玻淑,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呀伙,沒想到半個(gè)月后补履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剿另,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雨女。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馏臭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出括儒,到底是詐尸還是另有隱情锐想,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布规婆,位于F島的核電站蝉稳,受9級特大地震影響掘鄙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜操漠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一浊伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嚣鄙,春花似錦、人聲如沸舅列。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至榨惠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耽装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工剂邮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留横侦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓引瀑,卻偏偏與公主長得像榨馁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子翼虫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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

  • MySQL技術(shù)內(nèi)幕:InnoDB存儲(chǔ)引擎(第2版) 姜承堯 第1章 MySQL體系結(jié)構(gòu)和存儲(chǔ)引擎 >> 在上述例子...
    沉默劍士閱讀 7,423評論 0 16
  • 來源轉(zhuǎn)載自:http://www.cnblogs.com/ymy124/p/3718439.html MySQL的...
    Mrwangs閱讀 1,954評論 0 8
  • 問題:事務(wù)是什么掸宛,有什么用? 事務(wù)就是一個(gè)事情唧瘾,組成這個(gè)事情可能有多個(gè)單元,要求這些單元饰序,要么全都成功,要么全都不...
    yeller閱讀 747評論 0 0
  • 1求豫、概述 ??事務(wù)是數(shù)據(jù)庫區(qū)別于文件系統(tǒng)的重要特征之一,其用于保證數(shù)據(jù)庫的完整性猾蒂,事務(wù)能使批量的SQL語句要么完全...
    黒貓閱讀 749評論 0 2
  • 變瘦是晨,變美麗,變得陽光有活力 學(xué)好中醫(yī)罩缴,即使不是兒科,以后你都可以治啊 每天要有每天的計(jì)劃箫章,不能白活吧
    當(dāng)我是個(gè)書生閱讀 164評論 0 0