cinder dbapi中的 sqlalchemy 事務(wù)鎖 管理

對需要經(jīng)常并發(fā)操作的表翎冲,sqlalchemy可以加鎖保證數(shù)據(jù)一致性,with_lockmode('update')

with_lockmode(mode) 可選mode參數(shù)說明:

mode 參數(shù) 說明
None translates to no lockmode
'update' translates to FOR UPDATE (standard SQL, supported by most dialects)
'update_nowait' translates to FOR UPDATE NOWAIT (supported by Oracle, PostgreSQL 8.1 upwards)
'read' translates to LOCK IN SHARE MODE (for MySQL), and FOR SHARE (for PostgreSQL)
def _get_quota_usages(context, session, project_id):
    # Broken out for testability
    rows = model_query(context, models.QuotaUsage,
                       read_deleted="no",
                       session=session). \
        filter_by(project_id=project_id). \
        order_by(models.QuotaUsage.id.asc()). \
        with_lockmode('update'). \
        all()
    return {row.resource: row for row in rows}

cinder dbapi里處理死鎖的方法,_retry_on_deadlock(f)

def _retry_on_deadlock(f):
    """Decorator to retry a DB API call if Deadlock was received."""

    @functools.wraps(f)
    def wrapped(*args, **kwargs):
        while True:
            try:
                return f(*args, **kwargs)
            except db_exc.DBDeadlock:
                LOG.warning(_LW("Deadlock detected when running "
                                "'%(func_name)s': Retrying..."),
                            dict(func_name=f.__name__))
                # Retry!
                time.sleep(0.5)
                continue

    functools.update_wrapper(wrapped, f)
    return wrapped
    
    
@require_context
@_retry_on_deadlock
def reservation_commit(context, reservations, project_id=None):
    <!--代碼省略-->

_retry_on_deadlock(f)邏輯簡單,即抓到死鎖異常db_exc.DBDeadlock,則過0.5秒后重新執(zhí)行。調(diào)用方法是作為db函數(shù)的注釋標(biāo)簽叶堆。
@functools.wraps(f)和functools.update_wrapper(wrapped, f)是為了讓被注釋的方法保持 __name__ 和 __doc__ 等屬性阱飘,相關(guān)介紹參考 《Python-進(jìn)階-functools模塊小結(jié)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市虱颗,隨后出現(xiàn)的幾起案子沥匈,更是在濱河造成了極大的恐慌,老刑警劉巖忘渔,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件高帖,死亡現(xiàn)場離奇詭異,居然都是意外死亡畦粮,警方通過查閱死者的電腦和手機(jī)散址,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宣赔,“玉大人预麸,你說我怎么就攤上這事∪褰” “怎么了吏祸?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钩蚊。 經(jīng)常有香客問我贡翘,道長,這世上最難降的妖魔是什么砰逻? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任鸣驱,我火速辦了婚禮,結(jié)果婚禮上蝠咆,老公的妹妹穿的比我還像新娘丐巫。我一直安慰自己,他們只是感情好勺美,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布递胧。 她就那樣靜靜地躺著,像睡著了一般赡茸。 火紅的嫁衣襯著肌膚如雪缎脾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天占卧,我揣著相機(jī)與錄音遗菠,去河邊找鬼联喘。 笑死,一個胖子當(dāng)著我的面吹牛辙纬,可吹牛的內(nèi)容都是我干的豁遭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼贺拣,長吁一口氣:“原來是場噩夢啊……” “哼蓖谢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起譬涡,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤闪幽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涡匀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盯腌,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年陨瘩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕够。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡舌劳,死狀恐怖燕少,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒿囤,我是刑警寧澤客们,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站材诽,受9級特大地震影響底挫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脸侥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一建邓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睁枕,春花似錦官边、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跳仿,卻和暖如春诡渴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菲语。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工妄辩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惑灵,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓眼耀,卻偏偏與公主長得像英支,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哮伟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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