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实现实时监控文件的方法
Aug 26 Python
Python切换pip安装源的方法详解
Nov 18 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Django实现单用户登录的方法示例
Mar 28 Python
Python 中判断列表是否为空的方法
Nov 24 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
Python 生成VOC格式的标签实例
Mar 10 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Python爬虫JSON及JSONPath运行原理详解
Jun 04 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
Django CBV模型源码运行流程详解
Aug 17 Python
降低python版本的操作方法
Sep 11 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
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php表单敏感字符过滤类
2014/12/08 PHP
php数组添加与删除单元的常用函数实例分析
2015/02/16 PHP
Symfony查询方法实例小结
2017/06/28 PHP
指定js可访问其它域名的cookie的方法
2007/09/18 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
2012/09/20 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
javascript计时器详解
2015/02/28 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
JavaScript学习笔记之DOM基础 2.4
2015/08/14 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
javascript垃圾收集机制的原理分析
2016/12/08 Javascript
基于JavaScript实现下拉列表左右移动代码
2017/02/07 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[06:49]2018DOTA2国际邀请赛寻真——VirtusPro傲视群雄
2018/08/12 DOTA
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python中用Decorator来简化元编程的教程
2015/04/13 Python
对python中的pop函数和append函数详解
2018/05/04 Python
python实现淘宝秒杀脚本
2020/06/23 Python
浅析python的Lambda表达式
2019/02/27 Python
用Python写一个模拟qq聊天小程序的代码实例
2019/03/06 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
selenium自动化测试入门实战
2020/12/21 Python
高中生毕业自我鉴定
2013/10/10 职场文书
小学生班会演讲稿
2014/01/09 职场文书
买房子个人收入证明
2014/01/16 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python