Python Sqlalchemy如何实现select for update


Posted in Python onOctober 12, 2020

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

Python Sqlalchemy如何实现select for update

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 相关文章推荐
简单使用Python自动生成文章
Dec 25 Python
python字典排序实例详解
May 20 Python
python检测某个变量是否有定义的方法
May 20 Python
python获取命令行输入参数列表的实例代码
Jun 23 Python
python创建文件时去掉非法字符的方法
Oct 31 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
Jun 21 Python
python实现批量文件重命名
Oct 31 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
Python语法学习之进程的创建与常用方法详解
Apr 08 Python
浅析PyCharm 的初始设置(知道)
Oct 12 #Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 #Python
Django windows使用Apache实现部署流程解析
Oct 12 #Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 #Python
如何实现一个python函数装饰器(Decorator)
Oct 12 #Python
Vs Code中8个好用的python 扩展插件
Oct 12 #Python
Django中和时区相关的安全问题详解
Oct 12 #Python
You might like
php牛逼的面试题分享
2013/01/18 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
WordPress中获取指定分类及其子分类下的文章数目
2015/12/31 PHP
php pdo oracle中文乱码的快速解决方法
2016/05/16 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
2020/03/23 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
获取body标签的两种方法
2011/10/13 Javascript
加载 Javascript 最佳实践
2011/10/30 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
python中p-value的实现方式
2019/12/16 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
员工评语大全
2014/01/19 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
挂职个人工作总结
2015/03/05 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
2019假期福利管理制度!
2019/07/15 职场文书