Python Sqlalchemy如何实现select for update

 更新时间:2020年10月12日 10:19:45   作者:笨手笨脚越  
这篇文章主要介绍了Python Sqlalchemy如何实现select for update,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

sqlalchemy 对于行级锁有两种实现方式,with_lockmode(self, mode): 和 with_for_update(self, read=False, nowait=False, of=None),前者在sqlalchemy 0.9.0 被废弃,用后者代替。所以我们使用with_for_update !

看下函数的定义:

@_generative()
  def with_for_update(self, read=False, nowait=False, of=None):
    """return a new :class:`.Query` with the specified options for the
    ``FOR UPDATE`` clause.
 
    The behavior of this method is identical to that of
    :meth:`.SelectBase.with_for_update`. When called with no arguments,
    the resulting ``SELECT`` statement will have a ``FOR UPDATE`` clause
    appended. When additional arguments are specified, backend-specific
    options such as ``FOR UPDATE NOWAIT`` or ``LOCK IN SHARE MODE``
    can take effect.
 
    E.g.::
 
      q = sess.query(User).with_for_update(nowait=True, of=User)
 
    The above query on a Postgresql backend will render like::
 
      SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT
 
    .. versionadded:: 0.9.0 :meth:`.Query.with_for_update` supersedes
      the :meth:`.Query.with_lockmode` method.
 
    .. seealso::
 
      :meth:`.GenerativeSelect.with_for_update` - Core level method with
      full argument and behavioral description.
 
    """
     
read
  是标识加互斥锁还是共享锁. 当为 True 时, 即 for share 的语句, 是共享锁. 多个事务可以获取共享锁, 互斥锁只能一个事务获取. 有"多个地方"都希望是"这段时间我获取的数据不能被修改, 我也不会改", 那么只能使用共享锁.
nowait
  其它事务碰到锁, 是否不等待直接"报错".
of
  指明上锁的表, 如果不指明, 则查询中涉及的所有表(行)都会加锁.

q = sess.query(User).with_for_update(nowait=True, of=User)

对应于sql:

SELECT users.id AS users_id FROM users FOR UPDATE OF users NOWAIT

mysql 不支持这几个参数,转成sql都是:

SELECT users.id AS users_id FROM users FOR UPDATE

范例:

def query_city_for_update():
  session = get_session()
  with session.begin():
    query = session.query(City).with_for_update().filter(City.ID == 8)
    print 'SQL : %s' % str(query)
    print_city_info(query.first())

结果:

SQL : SELECT city."ID" AS "city_ID", city."Name" AS "city_Name", city."CountryCode" AS "city_CountryCode", city."District" AS "city_District", city."Population" AS "city_Population" 
FROM city 
WHERE city."ID" = :ID_1 FOR UPDATE

{'city': {'population': 234323, 'district': u'Utrecht', 'id': 8, 'country_code': u'NLD', 'name': u'Utrecht'}}

SELECT ... FOR UPDATE 的用法,不过锁定(Lock)的数据是判别就得要注意一下了。由于InnoDB 预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则mysql 将会执行Table Lock (将整个数据表单给锁住)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍

    Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍

    这篇文章主要介绍了Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍,需要的朋友可以参考下
    2014-06-06
  • Python基于gevent实现文件字符串查找器

    Python基于gevent实现文件字符串查找器

    这篇文章主要介绍了Python基于gevent实现文件字符串查找器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python模拟钢琴键盘实现演奏数鸭子歌曲

    Python模拟钢琴键盘实现演奏数鸭子歌曲

    前几天上课老师给我们讲了两个模块,然后利用这两个模块来模拟钢琴键盘去简单地演奏《数鸭子》今天来分享给大家,感兴趣的可以了解一下
    2022-11-11
  • Python+tkinter自定义实现文件选择按钮

    Python+tkinter自定义实现文件选择按钮

    这篇文章主要为大家详细介绍了如何利用Python和tkinter自定义实现简单的文件选择按钮和颜色选择按钮,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Python 装饰器实现DRY(不重复代码)原则

    Python 装饰器实现DRY(不重复代码)原则

    python的装饰器就是一种代码简洁的手段,在函数和方法有改动时,使得改动量最小。这篇文章给大家介绍了Python 装饰器实现DRY(不重复代码)原则,感兴趣的朋友一起看看吧
    2018-03-03
  • python切割图片的实现示例

    python切割图片的实现示例

    本文主要介绍了python切割图片的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Java编程迭代地删除文件夹及其下的所有文件实例

    Java编程迭代地删除文件夹及其下的所有文件实例

    这篇文章主要介绍了Java编程迭代地删除文件夹及其下的所有文件实例,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • python 中yaml文件用法大全

    python 中yaml文件用法大全

    本文主要是总结yaml常用的一些数据形式,对于我们正常的项目使用,已经足够用了,接下来通过本文给大家分享python 中yaml文件用法,需要的朋友参考下吧
    2021-07-07
  • Python堆排序的实现示例

    Python堆排序的实现示例

    堆排序是一种基于二叉堆数据结构的排序算法,本文主要介绍了Python堆排序的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Python列表中存放字典遇到的问题及处理

    Python列表中存放字典遇到的问题及处理

    这篇文章主要介绍了Python列表中存放字典遇到的问题及处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02

最新评论