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使用cStringIO实现临时内存文件访问的方法
Mar 26 Python
Python3读取zip文件信息的方法
May 22 Python
Python计算两个日期相差天数的方法示例
May 23 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
python3判断url链接是否为404的方法
Aug 10 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python 实现二维列表转置
Dec 02 Python
python 消除 futureWarning问题的解决
Dec 25 Python
python获取整个网页源码的方法
Aug 03 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
Nov 30 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与jquery设置和读取cookies
2013/08/08 PHP
2个比较经典的PHP加密解密函数分享
2014/07/01 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
跟我学Laravel之视图 & Response
2014/10/15 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
jquery固定底网站底部菜单效果
2013/08/13 Javascript
让IE8浏览器支持function.bind()方法
2014/10/16 Javascript
jQuery实现表单提交时判断的方法
2014/12/13 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
利用vue重构有赞商城的思路以及总结整理
2019/02/21 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
轻松学习JavaScript函数中的 Rest 参数
2019/05/30 Javascript
python多线程用法实例详解
2015/01/15 Python
python实现图书管理系统
2018/03/12 Python
10款最好的Python开发编辑器
2019/07/03 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
西班牙灯具网上商店:Lampara.es
2018/06/05 全球购物
英国DIY和家居装饰领域的主要品牌:Wickes
2019/11/26 全球购物
上课说话检讨书大全
2014/01/22 职场文书
大学军训感言800字
2014/02/27 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
四风对照检查材料范文
2014/09/27 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫