美文网首页openstack
cinder dbapi中的 sqlalchemy 事务锁 管理

cinder dbapi中的 sqlalchemy 事务锁 管理

作者: 笨手笨脚越 | 来源:发表于2017-07-19 21:07 被阅读426次

对需要经常并发操作的表,sqlalchemy可以加锁保证数据一致性,with_lockmode('update')

with_lockmode(mode) 可选mode参数说明:

mode 参数 说明
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秒后重新执行。调用方法是作为db函数的注释标签。
@functools.wraps(f)和functools.update_wrapper(wrapped, f)是为了让被注释的方法保持 __name__ 和 __doc__ 等属性,相关介绍参考 《Python-进阶-functools模块小结》

相关文章

  • cinder dbapi中的 sqlalchemy 事务锁 管理

    对需要经常并发操作的表,sqlalchemy可以加锁保证数据一致性,with_lockmode('update')...

  • 版本控制cinder增加新表

    [toc] 一、如何增加新表 检查当前数据库脚本版本,在cinder\db\sqlalchemy\migrate_...

  • mysql中的"锁"事儿总结

    定义 关于mysql中的锁,是用于管理不同事务对共享资源的并发访问的问题,分为行锁和表锁。 表锁与行锁的区别: 锁...

  • InnoDB存储引擎学习总结 第六章 锁

    命令 概述 锁机制用于管理对共享资源的并发访问 InnoDB中的锁 行级锁介绍 共享锁(S),允许事务读一行数据 ...

  • MySQL的意向锁

    什么是意向锁 在多层级锁中的事务中,如果事务在某节点持有读写锁,则事务在其父节点持有意向锁。这样通过判断目标节点的...

  • 高性能Mysql笔记

    一、Mysql架构与历史 1、架构图 2、锁 表锁 行级锁 3、事务 死锁 Mysql中的事务 1

  • 事务与锁

    事务、锁、同步的区别; 事务是数据库中的概念,包括ACID,其中I即isolation,隔离性,锁只是用来保证事务...

  • 面试问题记录(一) Day50 2019-01-09

    并发中的常用锁,乐观锁和悲观锁,实现及使用 事务的特性,原理,spring如何实现事务 spring的实现机制,I...

  • Sqlite事务锁状态以及死锁问题

    Sqlite事务锁 Sqlite事务中锁的状态 1 UNLOCKED: 表示数据库并未开启任何读写, 使用BEGI...

  • [转]SQL Server中的事务与锁

    转自SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器。 锁:多用...

网友评论

    本文标题:cinder dbapi中的 sqlalchemy 事务锁 管理

    本文链接:https://www.haomeiwen.com/subject/vyjrkxtx.html